簡體   English   中英

Haskell-幫助理解功能

[英]Haskell - help understanding a function

我有一個難以理解的神秘功能:

mystery :: [a] -> [[a]]
mystery [] = [[]]
mystery (x:xs) = sets ++ (map (x:) sets)
                 where sets = mystery xs

以下是一些輸入結果:

mystery [1,2] returns [[],[2],[1],[1,2]]
mystery [1,2,3] returns [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]

通過查看結果,我可以看到它計算了列表中數字的所有可能組合,但不是所有可能的排列……我想。

我遇到的麻煩實際上是通過遞歸並了解函數如何獲得這些結果。

我想我開始了->將(1 :)映射到[2],產生[1,2],但是在這一點上,我困惑了遞歸的工作方式以及是否仍在映射(1 :)或現在(2 :),然后精確到。

如果有人可以通過逐步說明(使用提供的示例之一)來幫助我,該功能如何工作(使用地圖並設置遞歸),將不勝感激!

謝謝!

Haskell將執行所謂的惰性評估,這意味着它只會根據需要從左到右(通常)進行處理。 因此,以您的mystery [1, 2]為例,Haskell將執行以下操作:

sets ++ (map (x:) sets)

計算結果為:

mystery (2:[]) ++ (map (1:) sets)

在這一點上,我們稱之為mystery (2:[])

mystery ([]) ++ (map (2:) sets) ++ (map (1:) sets)

mystery ([])將返回一個空列表列表

[[]] ++ (map (2:) sets) ++ (map (1:) sets)
[[]] ++ (map (2:) mystery []) ++ (map (1:) sets)

因此,Haskell現在將嘗試在包含空列表的列表上應用函數(2:)

[[]] ++ (2:[[]]) ++ (map (1:) sets)
[[]] ++ [[2]] ++ (map (1:) sets)
[[], [2]] ++ (map (1:) sets)

這會使事情變得更加混亂。

[[], [2]] ++ (map (1:) mystery (2:[]))

最后一sets將評估mystery (2:[])

[[], [2]] ++ (map (1:) (sets ++ (map (2:) sets)))
[[], [2]] ++ (map (1:) (mystery [] ++ (map (2:) sets))
[[], [2]] ++ (map (1:) ([[]] ++ (map (2:) mystery []))
[[], [2]] ++ (map (1:) ([[]] ++ (2:[[]]))
[[], [2]] ++ (map (1:) ([[]] ++ [[2]])

現在(1:)將應用於包含一個空列表和一個包含2的列表的列表:

[[], [2]] ++ (map (1:) ++ [[], [2]])
[[], [2]] ++ [[1], [1, 2]]
[[], [2], [1], [1, 2]]

該操作的實質是在最后兩個部分中。 Haskell創建一個類似於[[], [2]] ,然后將一個追加到每個列表的開頭以形成[[1], [1, 2]]

您的神秘函數是計算其輸入的冪集

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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