Proposal: Applicative => Monad: Call for consensus

Ian Lynagh igloo at earth.li
Tue Jan 4 13:25:36 CET 2011


On Mon, Jan 03, 2011 at 11:30:44PM +0100, Bas van Dijk wrote:
> 
> 1) Make Applicative a superclass of Monad. So the new hierarchy becomes:
> 
> class Applicative m => Monad m  where

> Now which notable things are not included in the patch for base:
> 
> * fmap is not renamed to map.
> * return and (>>) are not removed as a method.
> * fail is not removed as a method.
> * All the liftM functions are not removed in favour of fmap and liftAs.
> 
> I think these are better left as separate proposals.

OK, but I think it would be good to get any changes into a single
release, so people only need to fix their instances once.

>     (>>=) :: forall a b. m a -> (a -> m b) -> m b
>     m >>= f = join $ fmap f m
> 
>     join :: m (m a) -> m a
>     join m = m >>= id

Have you got an example of a Monad for which you'd want to define join
but not (>>=)?

> 
>     (>>) :: forall a b. m a -> m b -> m b
>     (>>) = (*>)
> 
>     return :: a -> m a
>     return = pure
> 
>     fail :: String -> m a
>     fail s = error s
> 
> 2) Make 'join' a method of Monad.

Why?

> 6) Add a Monad instance for ((,) a): (There are already Functor and
> Applicative instances for it.)
> 
> (Maybe this one should be left out of the patch)

It does sound like a separate issue.


Thanks
Ian




More information about the Libraries mailing list