在 Haskell 中将列表分组为 n 个元素的列表

2024-01-05

库中是否有对列表进行操作来生成 n 个元素的组?例如:n=3

groupInto 3 [1,2,3,4,5,6,7,8,9] = [[1,2,3],[4,5,6],[7,8,9]]

如果没有,我该怎么做?


快速搜索Hoogle http://www.haskell.org/hoogle/?hoogle=Int+-%3E+%5Ba%5D+-%3E+%5B%5Ba%5D%5D表明没有这样的功能。另一方面,有人回答说,在split包,称为chunksOf.

不过,您可以自己做

group :: Int -> [a] -> [[a]]
group _ [] = []
group n l
  | n > 0 = (take n l) : (group n (drop n l))
  | otherwise = error "Negative or zero n"

当然,一些括号可以删除,我留在这里是为了理解代码的作用:

基本情况很简单:每当列表为空时,只需返回空列表即可。

递归情况首先测试 ifn是积极的。如果n is 0或更低,我们将进入无限循环,而我们不希望这样。然后我们使用以下方法将列表分为两部分take http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:take and drop http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:drop: take返回第一个n元素同时drop返回其他的。然后我们添加第一个n将我们的函数应用于原始列表中的其他元素而获得的列表中的元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Haskell 中将列表分组为 n 个元素的列表 的相关文章

随机推荐