[Haskell-cafe] stack overflow when using ST monad

Chris Kuklewicz haskell at list.mightyreason.com
Thu Aug 24 07:46:34 EDT 2006

The write*Ref functions, like many "write into data structure" have the common 
problem of being much lazier than you want.  The nextState calls form a lazy 
thunk.  In fact it tries form 10^6 nested thunks to call nextState.  So you have 
to use something like seq to reduce the laziness:

> step :: Tag s -> ST s (Maybe Integer)
> step t = do
>         c <- readSTRef (count t)
>         s <- readSTRef (state t)
>         writeSTRef (count t) (c - 1)
>         let state'=nextState s
>         state' `seq` writeSTRef (state t) state'
>         if (c <= 0) then return Nothing else return (Just c)

More information about the Haskell-Cafe mailing list