[英]How to expand haskell expressions?
如何擴展
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]]
並得到了 output:
[[[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]
有人可以解釋一下表達式是如何評估的嗎?
括號很混亂。 map (interleave 2) [[3,4], [4,3]]
將產生一個列表。 的確:
map (interleave 2) [[3,4][4,3]]
-> [interleave 2 [3, 4], interleave 2 [4, 3]]
現在 interleave 將為自己生成一個列表列表,它在任何可能的插入點插入項目,所以:
[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]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.