Я понимаю, что 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)
может shortciruit, как внешний f
видит (&&) 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
..
Что еще здесь происходит?