рекурсия для foldr f x ys
, где ys = [y1,y2,...,yk]
выглядит как
f y1 (f y2 (... (f yk x) ...))
тогда как рекурсия для foldl f x ys
выглядит как
f (... (f (f x y1) y2) ...) yk
Важным отличием здесь является то, что если результат f x y
может быть вычислен с использованием только значения x
, то foldr
не нужно проверять весь список. Например
foldr (&&) False (repeat False)
возвращает False
, тогда как
foldl (&&) False (repeat False)
никогда не заканчивается. (Примечание: repeat False
создает бесконечный список, где каждый элемент равен False
.)
С другой стороны, foldl'
хвостовой рекурсив и строг. Если вы знаете, что вам придется обходить весь список независимо от того, что (например, суммировать числа в списке), то foldl'
более эффективен в пространстве (и, вероятно, времени), чем foldr
.