Почему foldr, примененный к строгой функции в обоих аргументах, не вызывает переполнение стека? - PullRequest
0 голосов
/ 18 мая 2018

Интересно, почему это выражение не вызывает переполнения стека в GHCi:

foldr (+) 0 [1..5000000] -- 12500002500000

Очевидно, что (+) является строгим в обоих аргументах, поэтому весь список должен быть пройден немедленно, а ленивость неНичего не помогло.

Сначала я подумал, что компилятор распознает (+) как ассоциативную операцию и преобразует ее в хвостовую рекурсию.

Однако следующая операция также работает:

foldr (-) 0 [1..5000000] -- -2500000

Что здесь происходит?

1 Ответ

0 голосов
/ 18 мая 2018

Последняя система исполнения GHC позволяет динамически наращивать свой стек.Попробуйте ограничить его, и вы увидите переполнение стека:

% ghci +RTS -K512K
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> foldr (+) 0 [1..5000000]
*** Exception: stack overflow
...