插入列表前过滤

时间:2013-11-06 00:28:19

标签: haskell

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

2 个答案:

答案 0 :(得分:4)

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

根据我的理解,你担心通过takeWhile (<100) [fib x | x <- [1..]],首先会对列表综合进行评估(永远采取),然后将对其应用(&lt; 100)。

事实并非如此。您可以这样想,列表完成只计算并按需生成值,如下所示: Lazy eval

Strict eval

相对

我希望这说得很清楚:D

答案 1 :(得分:3)

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