| Copyright | (c) The University of Glasgow 2001 | 
|---|---|
| License | BSD-style (see the file libraries/base/LICENSE) | 
| Maintainer | libraries@haskell.org | 
| Stability | provisional | 
| Portability | portable | 
| Safe Haskell | Trustworthy | 
| Language | Haskell2010 | 
Control.Monad
Contents
Synopsis
- class Functor f where- fmap :: (a -> b) -> f a -> f b
 
- class Applicative m => Monad m where
- class (Alternative m, Monad m) => MonadPlus m where
- mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b)
- mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
- forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)
- forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m ()
- sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
- sequence_ :: (Foldable t, Monad m) => t (m a) -> m ()
- (=<<) :: Monad m => (a -> m b) -> m a -> m b
- (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
- (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
- forever :: Applicative f => f a -> f b
- void :: Functor f => f a -> f ()
- join :: Monad m => m (m a) -> m a
- msum :: (Foldable t, MonadPlus m) => t (m a) -> m a
- mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a
- filterM :: Applicative m => (a -> m Bool) -> [a] -> m [a]
- mapAndUnzipM :: Applicative m => (a -> m (b, c)) -> [a] -> m ([b], [c])
- zipWithM :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m [c]
- zipWithM_ :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m ()
- foldM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b
- foldM_ :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m ()
- replicateM :: Applicative m => Int -> m a -> m [a]
- replicateM_ :: Applicative m => Int -> m a -> m ()
- guard :: Alternative f => Bool -> f ()
- when :: Applicative f => Bool -> f () -> f ()
- unless :: Applicative f => Bool -> f () -> f ()
- liftM :: Monad m => (a1 -> r) -> m a1 -> m r
- liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
- liftM3 :: Monad m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
- liftM4 :: Monad m => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
- liftM5 :: Monad m => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
- ap :: Monad m => m (a -> b) -> m a -> m b
- (<$!>) :: Monad m => (a -> b) -> m a -> m b
Functor and monad classes
The Functor class is used for types that can be mapped over.
Instances of Functor should satisfy the following laws:
fmap id == id fmap (f . g) == fmap f . fmap g
The instances of Functor for lists, Maybe and IO
satisfy these laws.
Instances
| Functor [] # | Since: base-2.1 | 
| Functor Maybe # | Since: base-2.1 | 
| Functor IO # | Since: base-2.1 | 
| Functor Par1 # | Since: base-4.9.0.0 | 
| Functor NonEmpty # | Since: base-4.9.0.0 | 
| Functor ReadP # | Since: base-2.1 | 
| Functor ReadPrec # | Since: base-2.1 | 
| Functor Down # | Since: base-4.11.0.0 | 
| Functor Product # | Since: base-4.8.0.0 | 
| Functor Sum # | Since: base-4.8.0.0 | 
| Functor Dual # | Since: base-4.8.0.0 | 
| Functor Last # | Since: base-4.8.0.0 | 
| Functor First # | Since: base-4.8.0.0 | 
| Functor STM # | Since: base-4.3.0.0 | 
| Functor Handler # | Since: base-4.6.0.0 | 
| Functor Identity # | Since: base-4.8.0.0 | 
| Functor ZipList # | Since: base-2.1 | 
| Functor ArgDescr # | Since: base-4.6.0.0 | 
| Functor OptDescr # | Since: base-4.6.0.0 | 
| Functor ArgOrder # | Since: base-4.6.0.0 | 
| Functor Option # | Since: base-4.9.0.0 | 
| Functor Last # | Since: base-4.9.0.0 | 
| Functor First # | Since: base-4.9.0.0 | 
| Functor Max # | Since: base-4.9.0.0 | 
| Functor Min # | Since: base-4.9.0.0 | 
| Functor Complex # | Since: base-4.9.0.0 | 
| Functor (Either a) # | Since: base-3.0 | 
| Functor (V1 :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor (U1 :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor ((,) a) # | Since: base-2.1 | 
| Functor (ST s) # | Since: base-2.1 | 
| Functor (Proxy :: Type -> Type) # | Since: base-4.7.0.0 | 
| Arrow a => Functor (ArrowMonad a) # | Since: base-4.6.0.0 | 
| Defined in Control.Arrow Methods fmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b # (<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 # | |
| Monad m => Functor (WrappedMonad m) # | Since: base-2.1 | 
| Defined in Control.Applicative Methods fmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b # (<$) :: a -> WrappedMonad m b -> WrappedMonad m a # | |
| Functor (ST s) # | Since: base-2.1 | 
| Functor (Arg a) # | Since: base-4.9.0.0 | 
| Functor f => Functor (Rec1 f) # | Since: base-4.9.0.0 | 
| Functor (URec Char :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor (URec Double :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor (URec Float :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor (URec Int :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor (URec Word :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor (URec (Ptr ()) :: Type -> Type) # | Since: base-4.9.0.0 | 
| Functor f => Functor (Alt f) # | Since: base-4.8.0.0 | 
| Functor f => Functor (Ap f) # | Since: base-4.12.0.0 | 
| Functor (Const m :: Type -> Type) # | Since: base-2.1 | 
| Arrow a => Functor (WrappedArrow a b) # | Since: base-2.1 | 
| Defined in Control.Applicative Methods fmap :: (a0 -> b0) -> WrappedArrow a b a0 -> WrappedArrow a b b0 # (<$) :: a0 -> WrappedArrow a b b0 -> WrappedArrow a b a0 # | |
| Functor ((->) r :: Type -> Type) # | Since: base-2.1 | 
| Functor (K1 i c :: Type -> Type) # | Since: base-4.9.0.0 | 
| (Functor f, Functor g) => Functor (f :+: g) # | Since: base-4.9.0.0 | 
| (Functor f, Functor g) => Functor (f :*: g) # | Since: base-4.9.0.0 | 
| (Functor f, Functor g) => Functor (Sum f g) # | Since: base-4.9.0.0 | 
| (Functor f, Functor g) => Functor (Product f g) # | Since: base-4.9.0.0 | 
| Functor f => Functor (M1 i c f) # | Since: base-4.9.0.0 | 
| (Functor f, Functor g) => Functor (f :.: g) # | Since: base-4.9.0.0 | 
| (Functor f, Functor g) => Functor (Compose f g) # | Since: base-4.9.0.0 | 
class Applicative m => Monad m where #
The Monad class defines the basic operations over a monad,
a concept from a branch of mathematics known as category theory.
From the perspective of a Haskell programmer, however, it is best to
think of a monad as an abstract datatype of actions.
Haskell's do expressions provide a convenient syntax for writing
monadic expressions.
Instances of Monad should satisfy the following laws:
Furthermore, the Monad and Applicative operations should relate as follows:
The above laws imply:
and that pure and (<*>) satisfy the applicative functor laws.
The instances of Monad for lists, Maybe and IO
defined in the Prelude satisfy these laws.
Minimal complete definition
Methods
(>>=) :: forall a b. m a -> (a -> m b) -> m b infixl 1 #
Sequentially compose two actions, passing any value produced by the first as an argument to the second.
(>>) :: forall a b. m a -> m b -> m b infixl 1 #
Sequentially compose two actions, discarding any value produced by the first, like sequencing operators (such as the semicolon) in imperative languages.
Inject a value into the monadic type.
Fail with a message.  This operation is not part of the
 mathematical definition of a monad, but is invoked on pattern-match
 failure in a do expression.
As part of the MonadFail proposal (MFP), this function is moved
 to its own class MonadFail (see Control.Monad.Fail for more
 details). The definition here will be removed in a future
 release.
Instances
| Monad [] # | Since: base-2.1 | 
| Monad Maybe # | Since: base-2.1 | 
| Monad IO # | Since: base-2.1 | 
| Monad Par1 # | Since: base-4.9.0.0 | 
| Monad NonEmpty # | Since: base-4.9.0.0 | 
| Monad ReadP # | Since: base-2.1 | 
| Monad ReadPrec # | Since: base-2.1 | 
| Monad Down # | Since: base-4.11.0.0 | 
| Monad Product # | Since: base-4.8.0.0 | 
| Monad Sum # | Since: base-4.8.0.0 | 
| Monad Dual # | Since: base-4.8.0.0 | 
| Monad Last # | Since: base-4.8.0.0 | 
| Monad First # | Since: base-4.8.0.0 | 
| Monad STM # | Since: base-4.3.0.0 | 
| Monad Identity # | Since: base-4.8.0.0 | 
| Monad Option # | Since: base-4.9.0.0 | 
| Monad Last # | Since: base-4.9.0.0 | 
| Monad First # | Since: base-4.9.0.0 | 
| Monad Max # | Since: base-4.9.0.0 | 
| Monad Min # | Since: base-4.9.0.0 | 
| Monad Complex # | Since: base-4.9.0.0 | 
| Monad (Either e) # | Since: base-4.4.0.0 | 
| Monad (U1 :: Type -> Type) # | Since: base-4.9.0.0 | 
| Monoid a => Monad ((,) a) # | Since: base-4.9.0.0 | 
| Monad (ST s) # | Since: base-2.1 | 
| Monad (Proxy :: Type -> Type) # | Since: base-4.7.0.0 | 
| ArrowApply a => Monad (ArrowMonad a) # | Since: base-2.1 | 
| Defined in Control.Arrow Methods (>>=) :: ArrowMonad a a0 -> (a0 -> ArrowMonad a b) -> ArrowMonad a b # (>>) :: ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a b # return :: a0 -> ArrowMonad a a0 # fail :: String -> ArrowMonad a a0 # | |
| Monad m => Monad (WrappedMonad m) # | Since: base-4.7.0.0 | 
| Defined in Control.Applicative Methods (>>=) :: WrappedMonad m a -> (a -> WrappedMonad m b) -> WrappedMonad m b # (>>) :: WrappedMonad m a -> WrappedMonad m b -> WrappedMonad m b # return :: a -> WrappedMonad m a # fail :: String -> WrappedMonad m a # | |
| Monad (ST s) # | Since: base-2.1 | 
| Monad f => Monad (Rec1 f) # | Since: base-4.9.0.0 | 
| Monad f => Monad (Alt f) # | Since: base-4.8.0.0 | 
| Monad f => Monad (Ap f) # | Since: base-4.12.0.0 | 
| Monad ((->) r :: Type -> Type) # | Since: base-2.1 | 
| (Monad f, Monad g) => Monad (f :*: g) # | Since: base-4.9.0.0 | 
| (Monad f, Monad g) => Monad (Product f g) # | Since: base-4.9.0.0 | 
| Monad f => Monad (M1 i c f) # | Since: base-4.9.0.0 | 
class (Alternative m, Monad m) => MonadPlus m where #
Monads that also support choice and failure.
Minimal complete definition
Nothing
Methods
The identity of mplus.  It should also satisfy the equations
mzero >>= f = mzero v >> mzero = mzero
The default definition is
mzero = empty
An associative operation. The default definition is
mplus = (<|>)
Instances
| MonadPlus [] # | Since: base-2.1 | 
| MonadPlus Maybe # | Since: base-2.1 | 
| MonadPlus IO # | Since: base-4.9.0.0 | 
| MonadPlus ReadP # | Since: base-2.1 | 
| MonadPlus ReadPrec # | Since: base-2.1 | 
| MonadPlus STM # | Since: base-4.3.0.0 | 
| MonadPlus Option # | Since: base-4.9.0.0 | 
| MonadPlus (U1 :: Type -> Type) # | Since: base-4.9.0.0 | 
| MonadPlus (Proxy :: Type -> Type) # | Since: base-4.9.0.0 | 
| (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) # | Since: base-4.6.0.0 | 
| Defined in Control.Arrow | |
| MonadPlus f => MonadPlus (Rec1 f) # | Since: base-4.9.0.0 | 
| MonadPlus f => MonadPlus (Alt f) # | Since: base-4.8.0.0 | 
| MonadPlus f => MonadPlus (Ap f) # | Since: base-4.12.0.0 | 
| (MonadPlus f, MonadPlus g) => MonadPlus (f :*: g) # | Since: base-4.9.0.0 | 
| (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) # | Since: base-4.9.0.0 | 
| MonadPlus f => MonadPlus (M1 i c f) # | Since: base-4.9.0.0 | 
Functions
Naming conventions
The functions in this library use the following naming conventions:
- A postfix 'M' always stands for a function in the Kleisli category: The monad type constructormis 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
Basic Monad functions
mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) #
Map each element of a structure to a monadic action, evaluate
 these actions from left to right, and collect the results. For
 a version that ignores the results see mapM_.
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) #
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) #
Evaluate each monadic action in the structure from left to
 right, and collect the results. For a version that ignores the
 results see sequence_.
sequence_ :: (Foldable t, Monad m) => t (m a) -> m () #
Evaluate each monadic action in the structure from left to right,
 and ignore the results. For a version that doesn't ignore the
 results see sequence.
As of base 4.8.0.0, sequence_ is just sequenceA_, specialized
 to Monad.
(=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 #
Same as >>=, but with the arguments interchanged.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c infixr 1 #
Left-to-right composition of Kleisli arrows.
forever :: Applicative f => f a -> f b #
Repeat an action indefinitely.
Examples
A common use of forever is to process input from network sockets,
 Handles, and channels
 (e.g. MVar and
 Chan).
For example, here is how we might implement an echo
 server, using
 forever both to listen for client connections on a network socket
 and to echo client input on client connection handles:
echoServer :: Socket -> IO () echoServer socket =forever$ do client <- accept socketforkFinally(echo client) (\_ -> hClose client) where echo :: Handle -> IO () echo client =forever$ hGetLine client >>= hPutStrLn client
void :: Functor f => f a -> f () #
void valueIO action.
Examples
Replace the contents of a Maybe Int
>>>void NothingNothing>>>void (Just 3)Just ()
Replace the contents of an Either Int IntEither Int '()'
>>>void (Left 8675309)Left 8675309>>>void (Right 8675309)Right ()
Replace every element of a list with unit:
>>>void [1,2,3][(),(),()]
Replace the second element of a pair with unit:
>>>void (1,2)(1,())
Discard the result of an IO action:
>>>mapM print [1,2]1 2 [(),()]>>>void $ mapM print [1,2]1 2
Generalisations of list functions
join :: Monad m => m (m a) -> m a #
The join function is the conventional monad join operator. It
 is used to remove one level of monadic structure, projecting its
 bound argument into the outer level.
Examples
A common use of join is to run an IO computation returned from
 an STM transaction, since STM transactions
 can't perform IO directly. Recall that
atomically :: STM a -> IO a
is used to run STM transactions atomically. So, by
 specializing the types of atomically and join to
atomically:: STM (IO b) -> IO (IO b)join:: IO (IO b) -> IO b
we can compose them as
join.atomically:: STM (IO b) -> IO b
filterM :: Applicative m => (a -> m Bool) -> [a] -> m [a] #
This generalizes the list-based filter function.
mapAndUnzipM :: Applicative m => (a -> m (b, c)) -> [a] -> m ([b], [c]) #
The mapAndUnzipM function maps its first argument over a list, returning
 the result as a pair of lists. This function is mainly used with complicated
 data structures or a state-transforming monad.
zipWithM :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m [c] #
zipWithM_ :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m () #
foldM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b #
The foldM function is analogous to foldl, except that its result is
encapsulated in a monad. Note that foldM works from left-to-right over
the list arguments. This could be an issue where ( and the `folded
function' are not commutative.>>)
foldM f a1 [x1, x2, ..., xm] == do a2 <- f a1 x1 a3 <- f a2 x2 ... f am xm
If right-to-left evaluation is required, the input list should be reversed.
foldM_ :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m () #
Like foldM, but discards the result.
replicateM :: Applicative m => Int -> m a -> m [a] #
replicateM n actn times,
 gathering the results.
replicateM_ :: Applicative m => Int -> m a -> m () #
Like replicateM, but discards the result.
Conditional execution of monadic expressions
guard :: Alternative f => Bool -> f () #
Conditional failure of Alternative computations. Defined by
guard True =pure() guard False =empty
Examples
Common uses of guard include conditionally signaling an error in
 an error monad and conditionally rejecting the current choice in an
 Alternative-based parser.
As an example of signaling an error in the error monad Maybe,
 consider a safe division function safeDiv x y that returns
 Nothing when the denominator y is zero and Just (x `div`
 y)
>>> safeDiv 4 0 Nothing >>> safeDiv 4 2 Just 2
A definition of safeDiv using guards, but not guard:
safeDiv :: Int -> Int -> Maybe Int
safeDiv x y | y /= 0    = Just (x `div` y)
            | otherwise = Nothing
A definition of safeDiv using guard and Monad do-notation:
safeDiv :: Int -> Int -> Maybe Int safeDiv x y = do guard (y /= 0) return (x `div` y)
when :: Applicative f => Bool -> f () -> f () #
Conditional execution of Applicative expressions. For example,
when debug (putStrLn "Debugging")
will output the string Debugging if the Boolean value debug
 is True, and otherwise do nothing.
unless :: Applicative f => Bool -> f () -> f () #
The reverse of when.
Monadic lifting operators
liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r #
Promote a function to a monad, scanning the monadic arguments from left to right. For example,
liftM2 (+) [0,1] [0,2] = [0,2,1,3] liftM2 (+) (Just 1) Nothing = Nothing
liftM3 :: Monad m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r #
Promote a function to a monad, scanning the monadic arguments from
 left to right (cf. liftM2).
liftM4 :: Monad m => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r #
Promote a function to a monad, scanning the monadic arguments from
 left to right (cf. liftM2).
liftM5 :: Monad m => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r #
Promote a function to a monad, scanning the monadic arguments from
 left to right (cf. liftM2).