marg-do's

関数型生活

畳込関数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) … )
左畳み込みの場合は無限に評価され続ける。