¿Cómo evitar el desbordamiento de pila en Haskell?

Haskell no admite ciclos para el cálculo, sino que ofrece el uso de algoritmos de recursión. Pero este enfoque conduce al crecimiento de la pila, e incluso al desbordamiento de la pila. Creo que debería haber un enfoque para resolver este problema en general. Aquí está la muestra. Quería saber cuántas veces getClockTimee puede llamar a @ 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

El programa dura 5 segundos, pero eventualmente obtengo:

Desbordamiento de espacio de pila: tamaño actual 8388608 bytes.
Utilice `+ RTS -Ksize -RTS 'para aumentarlo.

La administración manual del tamaño de la pila puede ayudar en casos particulares, pero si quisiera ejecutar este algoritmo durante 10 segundos, podría desbordarse nuevamente. Entonces esto no es una solución. ¿Cómo puedo hacer que este código funcione?

Respuestas a la pregunta(1)

Su respuesta a la pregunta