我正在努力学习一个Haskell(非常好),而我正在做的许多不同的事情之一是试图解决一些Project Euler问题,因为我正在测试我的勇气.
在做一些基于Fibonacci的问题时,我偶然发现并开始使用Fibonacci序列的递归无限列表版本:
fibs = 1 : 2 : zipWith (+) fibs (tail fibs)
对于其中一个PE问题,我需要提取甚至斐波纳契数小于4,000,000的子序列.我决定用列表理解来做这件事,在我玩代码时,我偶然发现了一些我不太了解的东西; 我假设我对Haskell的懒惰评估方案的掌握很弱,这使得事情复杂化.
以下理解工作正常:
[x | x <- takeWhile (<= 4000000) fibs, even x]
下一个理解永远旋转; 所以我经历并将输出返回到stdout,当它停在正确的位置时,它似乎继续永远地评估递归定义的列表,而不是在达到上限值后完成; 指示列表中的最后一项使用逗号打印但不存在其他列表项或结束方括号的事实:
[x | x <- fibs, x <= 4000000, even x]
那么各种功能使用的秘密酱究竟是什么呢?