惰性评估如何工作?

How does lazy evaluation work?

我是函数式编程的新手,我想了解惰性求值的工作原理。我有以下功能:

nats = 0:(map (+1) nats)
test = foldr (\x y-> if x > 2 then 0 else x+y) 10 nats

据我所知,第一个获取所有自然数的列表,直到它用完内存(但据我所知,这从未真正发生过),第二个应该完全正确什么?测试内部有一个 lambda 演算函数,如果 x > 2 和 x+y 则获取 x 和 y 和 returns 2,但这是否意味着它将 return 0 因为 x = 10 ?我有点困惑。那么,nats真的有必要吗?

编辑: 测试returns 3,但现在我真的很困惑,因为我不明白。

谢谢,如果我犯了一些菜鸟错误,我很抱歉,但我不明白这是如何工作的。

也许这些减少对您有帮助:

let x `op` y = if x > 2 then 0 else x + y

test                                       =>
foldr op 10 [0..]                          =>
0 `op` foldr op 10 [1..]                   =>
0 + foldr op 10 [1..]                      =>
0 + (1 `op` foldr op 10 [2..])             =>
0 + (1 + foldr op 10 [2..])                =>
0 + (1 + (2 `op` foldr op 10 [3..]))       =>
0 + (1 + (2 + foldr op 10 [3..]))          =>
0 + (1 + (2 + (3 `op` foldr op 10 [4..]))) =>
0 + (1 + (2 + 0))                          =>
0 + (1 + 2)                                =>
0 + 3                                      =>
3