They are equivalent in power for the function instance: flip f <*> g == g >>= f
. This is not true for most types that are instances of Monad though.
It's a little more clear if we compare <*>
and =<<
(which is flip (>>=)
) specialized to the ((->) r)
instance:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
-- Specialized to ((->) r):
(<*>) :: (r -> a -> b) -> (r -> a) -> r -> b
(=<<) :: Monad m => (a -> m b) -> m a -> m b
-- Specialized to ((->) r):
(=<<) :: (a -> r -> b) -> (r -> a) -> r -> b