Как избежать переполнения стека в 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 секунд, он может снова переполниться. Так что это не решение. Как я могу заставить этот код работать?

Ответы на вопрос(1)

Ваш ответ на вопрос