[Haskell-cafe] Stacking monads

Andrew Coppin andrewcoppin at btinternet.com
Thu Oct 2 15:40:31 EDT 2008

David Menendez wrote:
> In general, monads don't compose. That is, there's no foolproof way to
> take two monads m1 and m2 and create a third monad m3 which does
> everything m1 and m2 does. People mostly get around that by using
> monad transformers.

...OK then.

> You could try using an exception monad transformer here

I thought I already was?

At least, I spent about an hour reading through Control.Monad.Error 
trying to figure out what the hell is going on, and eventually arrived 
at a type signature that represents what I'm trying to do and seems to 
be accepted as a monad. But I can't define a working AND function with 
it. :-(

I was under the impression that you can stack monad transformers on top 
of each other and get it to work, but it doesn't seem to want to work 
for me...

> but that
> won't give you the same semantics. "ErrorT ErrorType ResultSet a" is
> isomorphic to "ResultSet (Either ErrorType a)".

Hmm. That would be something quite different. Either the entire 
computation fails returning a reason why, or it produces a normal result 

> If you must have something equivalent to Either ErrorType (ResultSet
> a), you either need to (1) redesign ResultSet to include error
> handling, (2) redesign ResultSet to be a monad transformer, or (3)
> restrict yourself to the operations in Applicative.
> Option (3) works because applicative functors *do* compose. (Also,
> every instance of Monad is trivially an instance of Applicative.)

Uh... what's Applicative? (I had a look at Control.Applicative, but it 
just tells me that it's "a strong lax monoidal functor". Which isn't 
very helpful, obviously.)

More information about the Haskell-Cafe mailing list