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?