讓我們看一下函數的功能爲您的輸入例:
transpose [[1,2,3],[4,5,6],[7,8,9]]
<=>
(map head [[1,2,3],[4,5,6],[7,8,9]]) : (transpose (map tail [[1,2,3],[4,5,6],[7,8,9]]))
<=>
[1,4,7] : (transpose [[2,3],[5,6],[8,9]])
<=>
[1,4,7] : (map head [[2,3],[5,6],[8,9]]) : (transpose (map tail [[2,3],[5,6],[8,9]]))
<=>
[1,4,7] : [2,5,8] : (transpose [[3],[6],[9]])
<=>
[1,4,7] : [2,5,8] : (map head [[3],[6],[9]]) : (transpose (map tail [[3],[6],[9]]))
<=>
[1,4,7] : [2,5,8] : [3, 6, 9] : (transpose [[], [], []])
<=>
[1,4,7] : [2,5,8] : [3, 6, 9] : [] -- because transpose ([]:_) = []
<=>
[[1,4,7],[2,5,8],[3,6,9]]
注意,在我選擇了減少條款的順序是不一樣的評價順序哈斯克爾會使用,但不會改變結果。
編輯:在回答你的問題編輯:
是這個
(map head x)
創建每個列表的頭元素的列表?
是的。
這ISN並不是一個答案,但通常當我試圖在Haskell中圍繞某些東西時,我會花一些時間在GHCi中玩弄它。嘗試「地圖頭」或「地圖尾巴」列表的幾個名單,你會看到自己如何工作。如果你來自一個勢在必行的世界,地圖和褶皺可能有點艱難。它們是你的主要循環結構 - 從本質上取代「for」和「while」 - 所以你很快就會學會去愛它們。 – rtperson 2010-04-05 14:59:28
+1 Grok(blahh) – 2010-04-08 23:01:49