2017-03-10 31 views
0

这里评估的Haskell代码:懒惰的评价与zipWith和两个无限列表

lazee = 0 : zipWith (+) (map (+1) lazee) (map (2*) lazee) 

,然后调用take 5 lazee产生这样的结果:

[0,1,4,13,40] 

我不明白的顺序评估上述功能。他们是无限的名单,我有点麻烦缠着我的头。因此我不确定Haskell会如何得到这个结果。

+0

你可以从'a [0] = 0'开始考虑一系列'a [n + 1] =(a [n] +1)+(2 * a [n])'相当于'3a [n] + 1'。 – karakfa

+0

@karakfa有道理,thx =) –

回答

2

它大致是这样的

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) 

等。