获取 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
的列表理解也有同样的问题。您可以通过分别调用 take
或 takeWhile
来解决它,而不是像您在问题中演示的那样在每个元素上使用保护。
我正在学习 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
的列表理解也有同样的问题。您可以通过分别调用 take
或 takeWhile
来解决它,而不是像您在问题中演示的那样在每个元素上使用保护。