base-4.22.0.0: src/Control/Monad.hs
{-# LANGUAGE Safe #-}
-- |
--
-- Module : Control.Monad
-- Copyright : (c) The University of Glasgow 2001
-- License : BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer : libraries@haskell.org
-- Stability : provisional
-- Portability : portable
--
-- The 'Functor', 'Monad' and 'MonadPlus' classes,
-- with some useful operations on monads.
module Control.Monad
(-- * Functor and monad classes
Functor(..),
Monad((>>=), (>>), return),
MonadFail(fail),
MonadPlus(mzero, mplus),
-- * Functions
-- ** Naming conventions
-- $naming
-- ** Basic @Monad@ functions
mapM,
mapM_,
forM,
forM_,
sequence,
sequence_,
(=<<),
(>=>),
(<=<),
forever,
void,
-- ** Generalisations of list functions
join,
msum,
mfilter,
filterM,
mapAndUnzipM,
zipWithM,
zipWithM_,
foldM,
foldM_,
replicateM,
replicateM_,
-- ** Conditional execution of monadic expressions
guard,
when,
unless,
-- ** Monadic lifting operators
liftM,
liftM2,
liftM3,
liftM4,
liftM5,
ap,
-- ** Strict monadic functions
(<$!>)
) where
import GHC.Internal.Control.Monad
{- $naming
The functions in this module use the following naming conventions:
* A postfix \'@M@\' always stands for a function in the Kleisli category:
The monad type constructor @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, for example:
> sequence :: Monad m => [m a] -> m [a]
> sequence_ :: Monad m => [m a] -> m ()
* A prefix \'@m@\' generalizes an existing function to a monadic form.
Thus, for example:
> filter :: (a -> Bool) -> [a] -> [a]
> mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a
-}