懒惰评估如何运作?

Vad*_*dan 1 haskell functional-programming lazy-evaluation

我是函数式编程的新手,我想要了解懒惰的评估是如何工作的.我有以下功能:

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

而据我所知,第一个得到所有自然数的列表,直到它耗尽内存(但从来没有真正发生过,我理解),第二个应该做的正是什么?测试有一个lambda演算函数,它得到一个x和y,如果x> 2和x + y,则返回2,但这是否意味着它将返回0,因为x = 10?我有点困惑.在那种情况下,nat真的需要吗?

编辑:测试返回3,但现在我真的很困惑,因为我不明白如何.

如果我犯了一些菜鸟错误,谢谢,抱歉,但我不明白这是怎么回事.

fre*_*yle 5

也许这些减少可以帮助你:

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
Run Code Online (Sandbox Code Playgroud)