Evaluating the argument/result was my intention. Evaluating the computation itself might be useful in some cases, though.
> (StrictT op) >>= f = StrictT (op >>= \ x -> x `seq` runStrictT (f x))Are you sure? Here you evaluate the result, and not the computation itself.
Wouldn't it be:
(StrictT op) >>= f = op ` seq` StrictT (op >>= \x -> runStrictT (f x))
??2012/1/21 David Barbour <dmbarbour@gmail.com>On Sat, Jan 21, 2012 at 10:08 AM, Roman Cheplyaka <roma@ro-che.info> wrote:* David Barbour <dmbarbour@gmail.com> [2012-01-21 10:01:00-0800]
> As noted, IO is not strict in the value x, only in the operation thatAgain, that wouldn't be a monad transformer, strictly speaking, because
> generates x. However, should you desire strictness in a generic way, it
> would be trivial to model a transformer monad to provide it.
"monads" it produces violate the left identity law.It meets the left identity law in the same sense as the Eval monad from Control.Strategies.That is, so long as values at each step can be evaluated to WHNF, it remains true that `return x >>= f` = f x.I did mess up the def of >>=. I think it should be:(StrictT op) >>= f = StrictT (op >>= \ x -> x `seq` runStrictT (f x))But I'm not interested enough to actually pull out an interpreter and test...Regards,Dave_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe