在此评估Haskell代码:
lazee = 0 : zipWith (+) (map (+1) lazee) (map (2*) lazee)
然后调用take 5 lazee
会产生以下结果:
[0,1,4,13,40]
我不明白评估上述功能的顺序。它们是无限的列表,我有点麻烦缠绕我的头。因此,我不确定Haskell会如何得到这个结果。
答案 0 :(得分: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)
等等。