On Thu, Nov 13, 2003 at 05:19:28PM -0500, Wojtek Moczydlowski wrote:
Consider the following program:
module A where
import Control.Monad.State
f :: StateT Int IO () f = (sequence_ $ repeat $ return ())
t = runStateT f 0
When t is evaluated under ghci or hugs, the program quickly runs out of heap memory. What's going on here? Is this inherent in StateT monad? If so, then this is very surprising, I would expect f to run in constant space for any sensible monad.
There is more to it. Let's define t2 :: IO () t2 = sequence_ $ repeat $ return () t2 behaves in the same way. However, if you compile the module with GHC with optimisations turned on, both t and t2 run in constant space. OK, I understand that GHC doesn't do optimisations in interpreted code. The strange thing is that if you execute *A> runStateT (sequence_ $ repeat $ return ()) 1 :: IO ((), Int) or *A> (sequence_ $ repeat $ return ()) :: IO () directly in GHCi, then is seems to run in constant space.
Wojtek
Best regards, Tom -- .signature: Too many levels of symbolic links