使用zipWith和两个无限列表在Haskell中进行延迟评估

时间:2017-03-10 14:10:37

标签: haskell

在此评估Haskell代码:

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

然后调用take 5 lazee会产生以下结果:

[0,1,4,13,40]

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

1 个答案:

答案 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)

等等。