Сегодня, когда я работал над одним маленьким скриптом, я использовал foldl
вместо foldl'
. Я получил stack overflow
, поэтому я импортировал Data.List (foldl')
и был доволен этим. И это мой рабочий день по умолчанию с foldl
. Просто используйте foldl'
, когда ленивая версия подходит для оценки.Практическое использование `foldl`
Real World Haskell
говорит, что в большинстве случаев мы должны использовать foldl'
вместо foldl
. Foldr Foldl Foldl' говорит, что
Обычно выбор между
foldr
иfoldl'
....
Однако, если функция объединения ленива в качестве первого аргумента,
foldl
может счастливо возвращать результат, гдеfoldl'
ударяется исключением.
И данный пример:
(?) :: Int -> Int -> Int
_ ? 0 = 0
x ? y = x*y
list :: [Int]
list = [2, 3, undefined, 5, 0]
okey = foldl (?) 1 list
boom = foldl' (?) 1 list
Ну, я извиняюсь, но это скорее академический, но интересный учебный пример. Поэтому я спрашиваю, есть ли пример практического использования foldl
? Я имею в виду, когда мы не можем заменить foldl
на foldl'
.
P. S. Я знаю, трудно определить термин practical
, но я надеюсь, что вы поймете, что я имею в виду.
P. P. S. Я понимаю, почему ленивый foldl
по умолчанию в haskell. Я не прошу никого переместить гору и сделать строгую версию по умолчанию. Меня просто интересуют примеры исключительного использования функции foldl
:)
P. P. P. S. S. Любое интересное использование foldl
приветствуется.
Вместо того чтобы просто избегать 'undefined', вы также можете использовать' foldl', чтобы избежать потенциально дорогостоящих операций. Если функция сгибания заканчивается на ранней стадии успешной операции, вы можете избежать выполнения дорогостоящих вычислений посредством лени. Там могут быть более понятные способы написания (моноиды приходят в голову), но складки могут быть приятными для оптимизации компилятора. – bheklilr
Да, я думал об этом. Но не может представить себе хороший пример такой функции. – d12frosted