MonadPlus instance for ContT

John Wiegley johnw at
Mon Jun 24 19:43:57 CEST 2013

>>>>> Ross Paterson <R.Paterson at> writes:

> Alistair Lynn has proposed the following instance:
>   instance (Monoid r, Monad m) => MonadPlus (ContT r m) where
>     mzero = ContT $ const $ return mempty
>     m `mplus` n = ContT $ \ c -> liftM2 mappend (runContT m c) (runContT n c)
> but this would also be possible:
>   instance (MonadPlus m) => MonadPlus (ContT r m) where
>     mzero = ContT $ const mzero
>     m `mplus` n = ContT $ \ c -> runContT m c `mplus` runContT n c
> Is one of them better?

I would think that allowing ContT to transform any Monad over any Monoid has
more utility than only transforming another MonadPlus.  But I have no real
world data to back this up, just a hunch.

John Wiegley
FP Complete                         Haskell tools, training and consulting               johnw on #haskell/

More information about the Libraries mailing list