如何扩展
concat( map (interleave 2) [[3,4][4,3]])
interleave::a->[a]->[[a]]
interleave x []=[[x]]
interleave x (y:ys)=(x:y:ys):map (y:) (interleave x ys)我用了ghci翻译,得到了以下答案:
[[2,3,4],[4,2,3],[3,4,2],[2,4,3],[3,2,4],[4,3,2]]我运行以下代码:
map (interleave 2) [[3,4][4,3]]得到了输出:
[[[2,3,4],[4,2,3],[3,4,2]],[[2,4,3],[3,2,4],[4,3,2]]]当我做模拟跑步时,我做了以下操作:
concat( map (interleave 2) [[3,4][4,3]])
=>
concat( interleave 2 [3,4], interleave 2 [4,3])
=>
concat([[2,3,4],[4,2,3],[3,4,2]],[[2,4,3],[3,2,4],[4,3,2]])
=>
[2,3,4,4,2,3,3,4,2,2,4,3,3,4,2,4,3,2]有人能解释一下这个表达式是如何计算的吗?
发布于 2022-09-19 16:43:47
括号让人困惑。map (interleave 2) [[3,4], [4,3]]将生成一个列表。的确:
map (interleave 2) [[3,4][4,3]]
-> [interleave 2 [3, 4], interleave 2 [4, 3]]现在,交织将生成一个列表列表,其中它在任何可能的插入点插入项目,因此:
[interleave 2 [3, 4], interleave 2 [4, 3]]
-> [[[2, 3, 4], [3, 2, 4], [3, 4, 2]], [[2, 4, 3], [4, 2, 3], [4, 2, 3]]]因此,这是整数列表的列表。现在我们将这些连接起来,这意味着将外部列表的两个元素连接起来,因此:
concat [[[2, 3, 4], [3, 2, 4], [3, 4, 2]], [[2, 4, 3], [4, 2, 3], [4, 2, 3]]]
-> [[2, 3, 4], [3, 2, 4], [3, 4, 2], [2, 4, 3], [4, 2, 3], [4, 2, 3]]https://stackoverflow.com/questions/73776497
复制相似问题