Интересно, почему это выражение не вызывает переполнения стека в GHCi:
foldr (+) 0 [1..5000000] -- 12500002500000
Очевидно, что (+)
является строгим в обоих аргументах, поэтому весь список должен быть пройден немедленно, а ленивость неНичего не помогло.
Сначала я подумал, что компилятор распознает (+)
как ассоциативную операцию и преобразует ее в хвостовую рекурсию.
Однако следующая операция также работает:
foldr (-) 0 [1..5000000] -- -2500000
Что здесь происходит?