
Hello,
It is not clear to me what is the right thing to do here (although I
agree that the transformer and the monad should be consistent). In
'monadLib' at first I was very careful to make things as lazy as
possible, but then I noticed that this was a source of memory leaks,
that a user of the library could not really avoid. So now I have
started making things stricter, not in the state itself, but rather
the pair (result,state). One always has to watch out for mfix, of
course, but things appear to be working at the moment.
-Iavor
On 11/21/05, Yitzchak Gale
In the following thread, I reported a problem I was having with programs diverging when they use infinite lists with StateT:
http://www.haskell.org//pipermail/haskell-cafe/2005-November/012253.html
Roberto Zunino and Wolfgang Jeltsch pointed out that this is a bug in Control.Monad.State: (>>=) is lazy in State, but strict in StateT.
The source of the problem is that the pattern match in the definition of (>>=) is inside a let expression in State - so it is lazy - but inside a do expression inside StateT - so it strict.
Roberto suggests a one-byte patch to fix this problem: add '~' to make the pattern match in StateT irrefutable.
(Note that this has already been done for the MonadFix instance of StateT.)
The same fix should be applied to evalStateT and execStateT. They are also stricter than their non-transformer counterparts, for the same reason.
-Yitz _______________________________________________ Libraries mailing list Libraries@haskell.org http://www.haskell.org/mailman/listinfo/libraries