如何将值捆绑到 Haskell 中的固定长度列表中?

How to bundle values into set length lists in Haskell?

尝试在 Haskell 中编写一个函数,将 xs 列表捆绑到大小为 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 但想不出要应用什么功能。

嗯,你可以使用 splitAt,例如

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

但是,您应该确保 n 为正数,否则您将得到一个无限的空列表列表。此函数包含您的属性:splitAt n returns 一对,其中元组的第一部分恰好有 n 个元素。由于除了最后一个列表条目之外的所有条目都是以这种方式创建的,因此您的第二个 属性 成立。第一个 属性 成立的原因显而易见。

然而,那些"bundles"通常被称为"chunks"。包split提供了拟合函数chunksOf,作用完全一样:

import Data.List.Split (chunksOf)

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