+
+{- | In many situations, the 'liftM' operations can be replaced by uses of
+'ap', which promotes function application.
+
+> return f `ap` x1 `ap` ... `ap` xn
+
+is equivalent to
+
+> liftMn f x1 x2 ... xn
+
+-}
+
+ap :: (Monad m) => m (a -> b) -> m a -> m b
+ap = liftM2 id
+
+{- $naming
+
+The functions in this library use the following naming conventions:
+
+* A postfix \`M\' always stands for a function in the Kleisli category:
+ @m@ is added to function results (modulo currying) and nowhere else.
+ So, for example,
+
+> filter :: (a -> Bool) -> [a] -> [a]
+> filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
+
+* A postfix \`_\' changes the result type from @(m a)@ to @(m ())@.
+ Thus (in the "Prelude"):
+
+> sequence :: Monad m => [m a] -> m [a]
+> sequence_ :: Monad m => [m a] -> m ()
+
+* A prefix \`m\' generalises an existing function to a monadic form.
+ Thus, for example:
+
+> sum :: Num a => [a] -> a
+> msum :: MonadPlus m => [m a] -> m a
+
+-}