私の理解はそれで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)
一番外側が最初の引数をfalseとf
見なし(&&) False ((&&) False (....))
、2番目の引数を評価する必要がないため、ショートサーキットできます(これは大きなサンクです)。
それで何が起こるか
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
しかし、これには永遠に時間がかかります。
2 番目の引数のパターン マッチングによって、答えoutermost andFn
がFalse
..
ここで他に何が起こっていますか?