【发布时间】:2015-04-25 10:41:55
【问题描述】:
我正在编写一个斐波那契序列生成器,我试图理解 Haskell 中的以下代码
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
我了解zipWith 是什么,但我不完全了解程序是如何执行的,以及为什么它会生成所有斐波那契数。我试图理解为什么它不会在函数式语言中使用环境概念终止,如下所示:
最初,因为 Haskell 的惰性求值,env 中的绑定应该是 fibs : [1,1,x],然后要求值 fibs,解释器求值 x,在这种情况下是 zipWith (+) fibs (tail fibs)。在评估zipWith 时,它得到fibs : [1,1,2,x],这也是因为Haskell 的懒惰评估。而env中的fibs此时绑定到[1,1,2,x]。然而,为了全面评估fibs,它会继续评估x,然后我们会回到前面的步骤。
这对吗?
另外,我注意到当我在ghci 中运行上面的程序时,它会立即提示它当前计算的斐波那契数列,为什么?完成所有计算后不应该打印结果吗?
【问题讨论】:
-
See one of my answers here 从“懒惰”的角度解释了这种计算的工作原理。这样做的副作用之一是,当您在 GHCi 中评估它时,它实际上被传递给
print,它可以懒惰地使用列表,将每个元素打印为可用的。您定义的fibs列表实际上是无限的,您实际上无法计算整个事物。