我应该如何划分列表?(不使用库)

How should I partition a list?(Without using libraries)

我应该如何对列表进行分区?(不使用库)

例如:

输入

[0,1,1,1,1,0,0,0,1]

输出

[[0,1,1],[1,1,0],[0,0,1]]

我已经通过在列表理解中使用 take 和 drop 来做到这一点。(我遇到了麻烦,因为我写了 take first 和 drop second,给了我不正确的分区)

这是对我有用的方法

[ drop ((size)*x) (take ((size)*(x+1)) (list)) | x<-[0..size]]

您可以递归地每次在 n 个元素之后拆分列表,然后生成第一个项目,并递归其余项目,因此:

partition :: Int -> [a] -> [[a]]
partition n = go
    where go [] = []
          go xs = ys : go yss
              where (ys, yss) = splitAt n xs

例如:

ghci> partition 3 [0,1,1,1,1,0,0,0,1]
[[0,1,1],[1,1,0],[0,0,1]]