Сегодня, когда я работал над одним маленьким скриптом, я использовал foldl
вместо foldl'
. Я получил stack overflow
, поэтому импортировал Data.List (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'
.
П.С. Я знаю, что термин practical
сложно дать определение, но я надеюсь, вы поймете, что я имею в виду.
P. P. S. Я понимаю, почему lazy foldl
по умолчанию в haskell. Я никого не прошу сдвигать гору и делать строгую версию по умолчанию. Меня просто очень интересуют примеры эксклюзивного использования функции foldl
:)
P. P. P. S. Что ж, любое интересное использование foldl
приветствуется.
undefined
, вы также можете использоватьfoldl
, чтобы избежать потенциально дорогостоящих операций. Если ваша функция сворачивания завершается рано после успешной операции, вы можете избежать выполнения дорогостоящих вычислений из-за лени. Могут быть более понятные способы его написания (на ум приходят моноиды), но свертки могут быть полезны для оптимизации компилятора. - person bheklilr   schedule 20.09.2014