0
这里评估的Haskell代码:懒惰的评价与zipWith和两个无限列表
lazee = 0 : zipWith (+) (map (+1) lazee) (map (2*) lazee)
,然后调用take 5 lazee
产生这样的结果:
[0,1,4,13,40]
我不明白的顺序评估上述功能。他们是无限的名单,我有点麻烦缠着我的头。因此我不确定Haskell会如何得到这个结果。
这里评估的Haskell代码:懒惰的评价与zipWith和两个无限列表
lazee = 0 : zipWith (+) (map (+1) lazee) (map (2*) lazee)
,然后调用take 5 lazee
产生这样的结果:
[0,1,4,13,40]
我不明白的顺序评估上述功能。他们是无限的名单,我有点麻烦缠着我的头。因此我不确定Haskell会如何得到这个结果。
它大致是这样的
lazee = 0 : lazee1
lazee1 = zipWith (+) (map (+1) lazee) (map (2*) lazee)
因此
lazee = 0 : lazee1
lazee1 = zipWith (+) (map (+1) (0:lazee1)) (map (2*) (0:lazee1))
但map (+1) (0:lazee1)
是1 : map (+1) lazee1
。同样的其他map
。因此
lazee = 0 : lazee1
lazee1 = zipWith (+) (1 : map (+1) lazee1) (0 : map (2*) lazee1)
现在zipWith
知道的第一要素,并能计算(+) 1 0
。我们得到
lazee = 0 : lazee1
lazee1 = 1 : lazee2
lazee2 = zipWith (+) (map (+1) lazee1) (map (2*) lazee1)
现在重复上述相同的步骤:
lazee2 = zipWith (+) (map (+1) (1:lazee2)) (map (2*) (1:lazee2))
= zipWith (+) (2 : map (+1) lazee2) (2 : map (2*) lazee2)
= 4 : zipWith (+) (map (+1) lazee2) (map (2*) lazee2)
等。
你可以从'a [0] = 0'开始考虑一系列'a [n + 1] =(a [n] +1)+(2 * a [n])'相当于'3a [n] + 1'。 – karakfa
@karakfa有道理,thx =) –