畳込関数foldrとfoldl
右畳み込み関数foldrは次の様な挙動をする。
ghci> foldr f acc xs (※xs = [x0, x1, x2, x3, x4]とする) f x4 (f x3 (f x2 (f x1 (f x0 acc))))
また、左畳み込み関数foldlは次のような挙動をする。
ghci> foldl f acc xs (※xs = [x0, x1, x2, x3, x4]とする) f (f (f (f (f acc x0) x1) x2) x3) x4
では、xsが無限リストの場合にどのように評価が行われるのか?
以下例、
ghci> foldr (&&) True (repeat False) False && (False && … (False (False && (False && True)))…) この場合、関数(&&)は第一引数がFalseの場合、第二引数を評価しない。 従って、畳み込みは無限に行われることなくFalseと評価される。 ghci> foldl (&&) True (repeat False) (…((((True && False) && False) && False) && False) … ) 左畳み込みの場合は無限に評価され続ける。