David Barbour dmbarbour at gmail.com
Sun Jan 22 00:46:23 CET 2012

```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 at 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 at gmail.com>
>
>> On Sat, Jan 21, 2012 at 10:08 AM, Roman Cheplyaka <roma at ro-che.info>wrote:
>>
>>> * David Barbour <dmbarbour at 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
>>
>>
>> _______________________________________________