繁体   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