Como evitar o estouro de pilha no Haskel

@Haskell não suporta ciclismo para computação, mas oferece o uso de algoritmos de recursão. Mas essa abordagem leva ao aumento da pilha e até ao excesso de pilha. Eu acredito que deve haver uma abordagem para resolver esse problema em geral. Aqui está a amostra. Eu queria saber quantas vezes getClockTime pode ser chamado por 5 segundos:

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

O programa dura 5 segundos, mas eventualmente eu estou recebendo:

Estouro de espaço na pilha: tamanho atual 8388608 byte
Use `+ RTS -Ksize -RTS 'para aumentá-l

O gerenciamento manual do tamanho da pilha pode ajudar em um caso específico, mas se eu desejar executar esse algo por 10 segundos, ele poderá estourar novamente. Portanto, isso não é uma solução. Como posso obter esse código funcionando?

questionAnswers(1)

yourAnswerToTheQuestion