Given:
Applicative m, Monad m => mf :: m (a -> b), ma :: m a
it seems to be considered a law that:
mf <*> ma ==
Just for the record, the answer to the question in the title is: consider
sequenceA :: Applicative f, Traversable t => t (f a) -> f (t a)
join :: Monad m => m (m a) -> m a
What is the type of join . sequenceA?
Monad m, Traversable m => m (m a) -> m aApplicative m, Monad m, Traversable m => m (m a) -> m aGranted, join . sequenceA is a contrived situation, but there are certainly cases where you need a monad, but you'd also like to use the Applicative operations <*>, *>, <*, <**>, etc. Then:
Applicative names is (IMHO) nicer than those of the traditional monad operations.ap, >>, <<, etc., is annoying ("oh, you can't use <*> there, that's a Monad not an Applicative"; "oh, you have to use <*> there, that's an Applicative not a Monad").>> and *> do different things, then you can't actually use the Applicative syntax, because it'll do something you don't expect.So, pragmatically, having an Applicative for every Monad which is compatible with it (in the (<*>) = ap sense) is a really, really good idea.