+1 on doing this. Period.
That said, there are a couple of ways that this proposal could be pragmatically improved.
The DefaultSignatures extension could be used to permit (GHC) users to avoid having to define definitions for the Functor and Applicative combinators (for simple monads, anyways.)
class Functor f where
fmap :: (a -> b) -> f a -> f b
#ifdef __DEFAULT_SIGNATURES__
default fmap :: Monad f => (a -> b) -> f a -> f b
fmap = liftM
#endif
class Functor f => Applicative f where
pure :: a -> f a
#ifdef __DEFAULT_SIGNATURES__
default pure :: Monad f => a -> f a
pure = return
#endif
(<*>) :: f (a -> b) -> f a -> f b
#ifdef __DEFAULT_SIGNATURES__
default (<*>) :: Monad f => f (a -> b) -> f a -> f b
(<*>) = ap
#endif
This would have the side-effect of replacing the return = pure definition though.
I offer it as a potential refinement on its own, that comes with its own benefits and limitations, but I want to be clear, my approval for this proposal stands regardless of this detail!
-Edward