我正在写一个斐波那契序列生成器,我试图理解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的懒惰评估.并且fibs在这个时候env必然[1,1,2,x].但是,为了进行全面评估fibs,它会继续评估x,我们将回到之前的步骤.
它是否正确?
此外,我注意到当我运行上面的程序时ghci,它立即提示它当前计算的斐波那契序列,为什么?一旦完成所有计算,它不应该打印结果吗?
以下Haskell代码没有终止,有人可以解释一下原因吗?谢谢.
f = let x = 10 in let x = x * x in x
Run Code Online (Sandbox Code Playgroud)
我认为解释器首先绑定x:10,然后将x*x计算为100并绑定x:100,环境变为x:100,然后整个表达式求值为100
但是,此代码不会终止.
我在Haskell中手动编写currying函数如下.
curry f = \x y -> f(x,y)
然后我用它max(x, y) = if x > y then x else y作为f,我写了max1 = curry max以获得curried函数
但这是不允许的.为什么这是错的?