我的理解是,foldl
执行foldr
如下:
foldl f a [1..30]
=>(f (f (f ... (f a 1) 2) 3) ... 30)
和
foldr f a [1..30]
=>(f 1 (f 2 (f 3 (f ....(f 30 a)))))..)
所以.. foldr (&&) False (repeat False)
can shortciruit as outermost f
sees(&&) False ((&&) False (....))
将第一个参数视为 false 并且不需要评估第二个参数(这是一个很大的 thunk)。
那么会发生什么
andFn :: Bool -> Bool -> Bool
andFn _ False = False
andFn x True = x
和
foldl andFn True (repeat False) -- =>
-- (andFn (andFn ...(andFn True False) ... False) False)
-- ^^ outermost andFn
但这需要永远。
我认为outermost andFn
通过第二个参数的模式匹配会知道,答案是False
..
这里还发生了什么?