我是函数式编程的新手,我想要了解懒惰的评估是如何工作的。我有以下功能:
nats = 0:(map (+1) nats)
test = foldr (\x y-> if x > 2 then 0 else x+y) 10 nats
据我所知,第一个得到所有自然数字的列表,直到它耗尽内存(但从未真正发生过,我理解),第二个应该完全做什么?测试在lambda演算函数内部得到x和y,如果x> 1则返回2。 2和x + y其他,但这是否意味着它将返回0因为x = 10?我有点困惑。在那种情况下,nat真的需要吗?
编辑: 测试返回3,但现在我真的很困惑,因为我不明白如何。
如果我犯了一些菜鸟错误,感谢和抱歉,但我还是不明白这是怎么回事。
答案 0 :(得分: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