【问题标题】:Lazy evaluation in Haskell with zipWith and two infinite lists使用 zipWith 和两个无限列表在 Haskell 中进行延迟评估
【发布时间】:2017-07-31 21:58:25
【问题描述】:

在这里评估 Haskell 代码:

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

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

[0,1,4,13,40]

我不明白上述函数的评估顺序。它们是无限的列表,我很难理解它。因此,我不确定 Haskell 是如何得到这个结果的。

【问题讨论】:

  • 你可以想到一个以a[n+1]=(a[n]+1)+(2*a[n])开头的系列,以a[0]=0开头,相当于3a[n]+1
  • @karakfa 有道理,谢谢 =)

标签: haskell


【解决方案1】:

大致是这样的

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)

等等。

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2016-09-12
    • 2014-12-22
    相关资源
    最近更新 更多