簡體   English   中英

如何擴展 haskell 表達式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM