6

私の理解はそれで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 andFnFalse..

ここで他に何が起こっていますか?

4

1 に答える 1