list - Haskell中的嵌套 block ?

标签 list haskell nested

说我想这样做:

nestedChunksOf [3, 2] [1,1,1,2,2,2,3,3,3,4,4,4] == [[[1,1,1], [2,2,2]], [[3,3,3], [4,4,4]]]

在 Python 中,我可以做到这一点
def group(a, *ns):
    for n in ns:
        a = [a[i:i+n] for i in xrange(0, len(a), n)]
    return a

group([1,1,1,2,2,2,3,3,3,4,4,4], 3, 2) == [[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]]]

但是在 Haskell 中,我不能只说
nestedChunksOf :: [Int] -> [a] -> [[a]]

或者
nestedChunksOf :: [Int] -> [a] -> [[[a]]]

那么我怎样才能在 Haskell 中实现同样的目标呢?

最佳答案

nestedChunksOf 这样的函数不能直接在 Haskell 中完成,至少不能在普通列表上操作。列表的深度是类型的一部分,因此您不能通过参数指定任意深度。

但是你可以做的是嵌套chunksOf .

如果我们定义 chunksOf像这样:

chunksOf :: Int -> [a] -> [[a]]
chunksOf _ [] = []
chunksOf n xs = fxs : chunksOf n sxs
    where (fxs, sxs) = splitAt n xs

然后我们可以嵌套它:
Main> :l test.hs
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> chunksOf 3 [1,1,1,2,2,2,3,3,3,4,4,4]
[[1,1,1],[2,2,2],[3,3,3],[4,4,4]]
*Main> chunksOf 2 $ chunksOf 3 [1,1,1,2,2,2,3,3,3,4,4,4]
[[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]]]

我希望这能实现你想要的!

关于list - Haskell中的嵌套 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553458/

相关文章:

Haskell 错误 : "lacks an accompanying binding" and "not in scope"

javascript - 如何确定所有文件已被读取并解决 promise

json - 使用 jq 有条件地修改嵌套的 json

Haskell:类型类可以定义类型(ala 类型特征)

haskell - Haskell 中双序列和位遍历之间的关系如何运作?

python - 很难理解嵌套函数

将递归列表的所有值替换为向量的值

jquery 使用选择器查找元素的索引

javascript - 按字母顺序排列项目列表

python - 如何在Python中为列表的每个元素分配名称