我最近开始学习哈斯克尔,我遇到过这样的问题:
我想生成只有偶数的斐波纳契数列表。我已经创建了递归函数来计算斐波纳契数,现在我试图将这些数字插入到列表中
[fib x | x <- [1..]]
现在假设我想只放置那些小于某个数字的计算fib x
个数字,例如。 fib x < 92100000
我可以使用filter(<92100000)[fib x | x <- [1..]]
打印此数字,但代码仍将永久运行,填充列表。
当fib x
足够大时,如何完成列表插入?
答案 0 :(得分:4)
Haskell有一个有趣的属性,称为“懒惰”,即它只计算任何必要的值。
根据我的理解,你担心通过takeWhile (<100) [fib x | x <- [1..]]
,首先会对列表综合进行评估(永远采取),然后将对其应用(&lt; 100)。
事实并非如此。您可以这样想,列表完成只计算并按需生成值,如下所示:
与
相对我希望这说得很清楚:D
答案 1 :(得分:3)
takeWhile (<92100000) [fib x | x <- [1..]]
将在到达第一个未通过条件的元素后终止,即在第一个元素大于或等于92100000之后终止。