1

我最近开始学习haskell,遇到了这样的问题:
我想生成只有偶数的斐波那契数列。我已经创建了计算斐波那契数的递归函数,现在我正在尝试将这些数字插入到列表中
[fib x | x <- [1..]]
现在假设我只想放入那些fib x小于某个数字的计算数字,例如。fib x < 92100000
我可以用 打印这些数字filter(<92100000)[fib x | x <- [1..]],但代码仍将永远运行,填充列表。
如何完成列表插入,何时fib x足够大?

4

2 回答 2

4

Haskell 有一个有趣的属性,称为“惰性”,即它只计算任何必要的值。

据我了解,您担心通过这样做takeWhile (<100) [fib x | x <- [1..]],首先将评估列表理解(永远使用),然后将 takeWhile (<100) 应用于它。

不是这种情况。你可以这样想,列表理解只根据需要计算和产生值,如下所示: 懒惰评估

相对于严格评估

我希望这很清楚:D

于 2013-11-06T02:11:07.493 回答
3

takeWhile (<92100000) [fib x | x <- [1..]]将在到达第一个不符合条件的元素后终止,即在第一个元素大于或等于 92100000 之后。

于 2013-11-06T00:29:46.067 回答