
This interesting page in Wikibooks describes how to write MaybeT: http://en.wikibooks.org/wiki/Haskell/Monad_transformers And it makes MaybeT an instance of MonadPlus. Even when used with IO as the inner monad. the constraint on the inner monad is Monad, not Monad plus: instance (Monad m) => MonadPlus (MaybeT m) where Apparently IO is not normally an instance of MonadPlus. It is interesting to be able to combine IO operations with mplus, because the idea of "trying computations until one succeeds" is so common in IO. Then I started wondering if StateT or ErrorT could be used to make IO the inner monad of a MonadPlus instance. Well, StateT is an instance of MonadPlus but with a MonadPlus constraint on the inner monad, so IO won't cut it. This leads me to wonder if there is a way to write mplus and mzero in StateT or ErrorT without a MonadPlus constraint on the inner monad. But if not, what was special about MaybeT as described in Wikibooks?