私の理解では、foldl
とfoldr
は以下のように実行されるということです。なぜfoldlはandFn関数で短絡していないのですか?
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 ((&&) False (....))
が最初に見たように、最も外側のf
が見shortciruitすることができます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
で何が起こるかしかし、これは永遠に取っています。
私はここで何が起こっている他に何
... outermost andFn
は、第二引数にパターンマッチングによって、答えはFalse
であることを知っているだろうと思いましたか?