尝试在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但不能想到应用什么功能。
答案 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