Как избежать переполнения стека в Haskell?
Haskell не поддерживает циклические вычисления, вместо этого он предлагает использовать рекурсивные алгоритмы. Но такой подход приводит к росту стека и даже переполнению стека. Я считаю, что должен быть подход, чтобы решить эту проблему в целом. Вот образец. Я хотел знать, сколько разgetClockTime может вызываться за 5 секунд:
import System.Time
nSeconds = 5
main = do
initTime <- totalPicoSeconds `fmap` getClockTime
doWork initTime 1
where
doWork initTime n = do
currTime <- totalPicoSeconds `fmap` getClockTime
if (currTime - initTime) `div` 10 ^ 12 >= nSeconds
then print n
else doWork initTime (n+1)
totalPicoSeconds :: ClockTime -> Integer
totalPicoSeconds (TOD a b) = a * 10 ^ 12 + b
Программа идет 5 секунд, но в итоге я получаю:
Переполнение стека: текущий размер 8388608 байт.
Используйте `+ RTS -Ksize -RTS ', чтобы увеличить его.
Ручное управление размером стека может помочь в конкретном случае, но если я захочу запустить этот алгоритм в течение 10 секунд, он может снова переполниться. Так что это не решение. Как я могу заставить этот код работать?