簡體   English   中英

Haskell了解一些功能

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

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