proposal #4095: add Applicative instance for Either

Ross Paterson ross at soi.city.ac.uk
Tue May 25 13:21:40 EDT 2010


On Tue, May 25, 2010 at 07:08:26PM +0200, Bas van Dijk wrote:
> I assume that when this instance is added to Control.Applicative, the
> one in Control.Monad.Trans.Error from transformers will be removed.

Yes.  It may need some ifdeffery.

> On Tue, May 25, 2010 at 6:22 PM, Yitzchak Gale <gale at sefer.org> wrote:
> > -1 for the orphan Monad instance with the silly
> > superclass constraint that this Applicative instance
> > is meant to extend
> 
> I assume you are referring to:
> 
> instance (Error e) => Monad (Either e) where
>     return        = Right
>     Left  l >>= _ = Left l
>     Right r >>= k = k r
>     fail msg      = Left (strMsg msg)
> 
> defined in Control.Monad.Trans.Error from transformers or
> Control.Monad.Error from mtl.
> 
> Thinking out loudly: since the 'fail' method is considered to be a
> mistake, what about not defining it? As in:
> 
> instance Monad (Either e) where
>     return        = Right
>     Left  l >>= _ = Left l
>     Right r >>= k = k r

Fine by me.  Making it a non-orphan would break Haskell 98 compatibility,
though.  You'd also have to delete its MonadPlus instance.


More information about the Libraries mailing list