Насколько я понимаю, 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)
может закорачиваться, так как самый внешний f
видит (&&) False ((&&) False (....))
видит первый аргумент как ложный и не должен оценивать второй аргумент (который является большим преобразователь).
так что происходит с
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
..
Что еще здесь происходит?