Have you tried to compile your code with optimisations? I guess GHC's strictness analysis would find strict evaluation is better here.
Claude Heiland-Allen wrote:Thanks!
> Control.Monad.State.Strict is strict in the actions, but the state
> itself is still lazy, so you end up building a huge thunk in the
> state containing all the updates that ever took place to the initial
> state.
>
> Using this should fix it:
>
> modify' :: MonadState s m => (s -> s) -> m ()
> modify' f = do
> x <- get
> put $! f x -- force the new state when storing it
So, why does Control.Monad.State.Strict.modify not do that?
And, I still don't quite understand why this only happened
when the updated value is obtained using IO.
--
see shy jo
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe