[英]Haskell understanding some functions
有人可以解釋為什么第一個函數生成流"a"
, "aa"
, "aaa"
..嗎? 或為什么第二個生成一個前綴流,例如: prefixes [1,2,3..]
-> [[],[1],[1,2], [1,2,3]..]
strings = "" : ( map ('a' :) strings )
prefixes (x : xs) = [] : ( map (x :) (prefixes xs) )
這些都是一些非常有趣的“打結”示例。 您可以通過認真地進行評估來在操作上理解它們,並確保永遠不要評估過多。 您也可以方程式地理解它們。 有時后者更容易
例如,如果我們考慮strings
的細微變化
strungs = map ('a':) strungs
我們能想到的答案為任意值strungs
去,如果你不變map ('a':)
過去。 如果我們想象strungs
是一個字符串列表(必須按類型排列),則對該列表執行map ('a':)
會在每個元素的前面添加一個新的'a'。
因此,唯一的選擇strungs
,這樣的地圖后變為不變的是,如果它是任何長度的列表,其中每個元素是無限的字符串“AAAAA ......”。
現在, strings
很像strings
strungs
,但是還有另一個條件。 無論strings
是什么,它都必須與"" : map ('a':) strings
。 可以很容易地看出,我們在這里玩游戲的方式與strungs
游戲類似,只是我們不斷添加新的空白元素。 因此, strings
必須看起來像
"", "a", "aa", "aaa", "aaaa", ...
因為map ('a':) strings
看起來像
"a", "aa", "aaa", "aaaa", "aaaaa", ...
然后加上""
使其與我們開始時的相同
"", "a", "aa", "aaa", "aaaa", "aaaaa", ...
它們都非常相似,因此我只向您顯示strings
,讓您自己找出prefixes
作為練習。
Haskell喜歡遞歸和惰性。 惰性表示值由thunk表示,或表示將來的計算。 當您評估以下內容時,您實際上可以在GHCi中看到它們:
> let strings = "" : map ('a' :) strings
> :print strings
strings = (_t1 :: [[Char]])
> strings !! 0
""
> :print strings
strings = "" : (_t2 :: [[Char]])
> strings !! 1
"a"
> :print strings
strings = "" : "a" :: (_t3 :: [[Char]])
> strings !! 2
"aa"
:print strings
strings = "" : "a" : "aa" : (_t4 :: [[Char]])
每個_tN
代表一個指向尚未評估的其余流的指針。 您也可以像這樣可視化它,其中_
表示指向其余strings
的指針
strings
= "" : map ('a':) strings
^--------<------^
= "" : map ('a':) ("" : _)
^--------<-------^
= "" : ('a':"") : map ('a':) (_)
^--------<-------------^
= "" : "a" : map ('a':) ("a" : _)
^-------<---------^
= "" : "a" : ('a':"a") : map ('a':) (_)
^---------<-------------^
= "" : "a" : "aa" : map ('a':) ("aa" : _)
^--------<---------^
= "" : "a" : "aa" : ('a':"aa") : map ('a':) (_)
^----------<-------------^
= "" : "a" : "aa" : "aaa" : map ('a':) ("aaa" : _)
^---------<---------^
= "" : "a" : "aa" : "aaa" : ('a':"aaa") : map ('a':) (_)
^------------<------------^
= "" : "a" : "aa" : "aaa" : "aaaa" : map ('a':) ("aaaa" : _)
^---------<----------^
= ...
希望這是有道理的,每個^-<-^
顯示_
在每次迭代中所指向的內容(大致)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.