Hi, I have been playing with Maybe and Output monad transformers 
and realized that I cannot make the following work nicely:

> foo a b = do
>       output "before"
>       r <- (liftM2(+)) a b
>       when r == Nothing $ output "error"
>       return r

As soon as computation produces Nothing, I am loosing ability to do any 
output. I think what I need is not wrapping one monad into another with 
transformer; I need some sort of monad combiner:

> newtype MC m1 m2 = MC (m1 a, m2 b)

So I could execute both of monads âin parallelâ. But I have no idea 
how to express this or even if this is doable at all. Any comments?

Thanks,
Pavel.

P.S. Here is summary of what I tried with transformers so far:

Letâs say I have following monad transformers:

> newtype MaybeMonadT m a = MMT  (m a)

> newtype OuptutMonadT m o a = OMT (m a, o)

And I am trying to use following monads:

> type M1 a = MaybeMonadT OutputM a
> type M2 a = OuptutMonadT Maybe String a

Now, they both wonât quite work in the following example:

> foo a b = do
>       output "before"
>       r <- (liftM2(+)) a b
>       when r == Nothing $ output "error"
>       return r


In case of M1, as soon as I get Nothing in r, computation will stop 
and return without any output gathered.

In case of M2, as soon as I get Nothing in r, computation will stop 
and return only with output gathered so far. That is 
> output "error" 
will never be called.


_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to