Evaluating the argument/result was my intention. Evaluating the computation itself might be useful in some cases, though.

Regards,

Dave

On Sat, Jan 21, 2012 at 3:20 PM, Yves Parès <yves.pares@gmail.com> wrote:
> (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 that
> generates x. However, should you desire strictness in a generic way, it
> would be trivial to model a transformer monad to provide it.

Again, that wouldn't be a monad transformer, strictly speaking, because
"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