如何将值捆绑到 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
尝试在 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