获取 haskell 中的每个斐波那契值

Get each fibbonacci value in haskell

我正在学习 haskell 并且我有以下代码:

fib a b =
  a : fib b (a + b)

findFibSum =
  sum [x | x <- fib 1 2, mod x 2 == 0 && x < 100]

如果我 运行 findFibSum 没有任何反应,它就只是坐在那里。不应该 fib 和 return 每个项目进行评估吗?我猜这与惰性评估有关。

如果我先调用 take 并让 findFibSum 接受获取的列表,例如:

findFibSum $ take 100 $ fib 1 2

它反而起作用了。我该怎么做才能取回并检查每个项目?我可能可以通过使用 take 批量获取来逃脱,但我想先了解这一点。

更新

感谢@amalloy,我终于可以使用它了:

findFibSum xs =
  sum [x | x <- takeWhile (<4000000) xs, mod x 2 == 0]

takeWhile 确保它一旦达到 >= 4m 就会停止从 fib 检索值。

考虑对前 100 个正整数求和的更简单的问题:

sum [x | x <- [1,2..], x <= 100]

这也不行。作为一个人,你知道一旦 x <= 100 return 为假,它就永远不会再 return 为真,因为 x 越来越大。但是 Haskell 不知道!所以这个列表理解产生前 100 个整数,然后尝试 101 并发现它不起作用,然后尝试 102 并发现它不起作用......sum 无法确定没有列表中的更多元素,因此它永远不会 return 一个数字给你。

你对 fib 1 2 的列表理解也有同样的问题。您可以通过分别调用 taketakeWhile 来解决它,而不是像您在问题中演示的那样在每个元素上使用保护。