如何将值捆绑到Haskell中的集长列表中?

时间:2017-01-04 12:55:58

标签: haskell functional-programming fold

尝试在Haskell中编写一个函数,该函数将x列表捆绑到大小为n的列表中,例如bundle 3 [1..10]的结果应为[[1,2,3],[4,5,6],[7,8,9],[10]]

我知道类型应该是

bundle :: Int -> [a] -> [[a]]

需要满足

之类的东西
concat $ bundle n xs == xs
length xss > 1 ==> all (\xs -> n  == length xs) (init xss)

但是当我真正尝试实施它时,我会陷入困境。我想我需要使用foldl但不能想到应用什么功能。

1 个答案:

答案 0 :(得分:2)

好吧,你可以使用splitAt,例如

bundle :: Int -> [a] -> [[a]]
bundle _ [] = []
bundle n xs = as : bundle n bs
  where (as, bs) = splitAt n xs

但是,你应该确保n是正面的,否则你最终会得到一个无限的空列表列表。此函数保存您的属性:splitAt n返回一对,其中元组的第一部分具有完全n个元素。由于除了最后一个列表条目之外的所有条目都是以这种方式创建的第一个属性有明显的原因。

然而,那些“捆绑”通常被称为“块”。包split提供了拟合函数chunksOf,它完全相同:

import Data.List.Split (chunksOf)

bundle :: Int -> [a] -> [[a]]
bundle = chunksOf