Как новичок в Haskell, я пытаюсь многократно перебирать функцию (например, логическую карту). На императивном языке это будет простой цикл, однако в Haskell я заканчиваю переполнение стека. Возьмем, к примеру, этот код:
main = print $ iter 1000000
f x = 4.0*x*(1.0-x)
iter :: Int -> Double
iter 0 = 0.3
iter n = f $ iter (n-1)
Для небольшого числа итераций код работает, но за миллион итераций я получаю переполнение стека:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
Я не понимаю, почему это происходит. Здесь должна быть хорошая рекурсия хвоста.
Может быть, проблема - ленивая оценка. Я экспериментировал с несколькими способами принудительной строгой оценки, вставляя $!
или seq
в разные позиции, но без успеха.
Каким будет метод Haskell для многократного итерации функции?
Я пробовал предложения из соответствующих сообщений: здесь или здесь, но я всегда получал stackoverflow для большого количества итераций, например main = print $ iterate f 0.3 !! 1000000
.