Safe Haskell | Trustworthy |
---|---|
Language | Haskell2010 |
Synopsis
- class Applicative m => Monad (m :: Type -> Type ) where
- class ( Alternative m, Monad m) => MonadPlus (m :: Type -> Type ) where
- (=<<) :: 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
- (>>) :: Monad m => m a -> m b -> m b
- forever :: Applicative f => f a -> f b
- join :: Monad m => m (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 ()
- concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b]
- 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
- liftM' :: Monad m => (a -> b) -> m a -> m b
- liftM2' :: Monad m => (a -> b -> c) -> m a -> m b -> m c
- ap :: Monad m => m (a -> b) -> m a -> m b
- (<$!>) :: Monad m => (a -> b) -> m a -> m b
Documentation
class Applicative m => Monad (m :: Type -> Type ) where Source #
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:
- Left identity
-
return
a>>=
k = k a - Right identity
-
m
>>=
return
= m - Associativity
-
m
>>=
(\x -> k x>>=
h) = (m>>=
k)>>=
h
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.
(>>=) :: m a -> (a -> m b) -> m b infixl 1 Source #
Sequentially compose two actions, passing any value produced by the first as an argument to the second.
'
as
' can be understood as the
>>=
bs
do
expression
do a <- as bs a
Inject a value into the monadic type.
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 Complex |
Since: base-4.9.0.0 |
Monad Min |
Since: base-4.9.0.0 |
Monad Max |
Since: base-4.9.0.0 |
Monad First |
Since: base-4.9.0.0 |
Monad Last |
Since: base-4.9.0.0 |
Monad Option |
Since: base-4.9.0.0 |
Monad Identity |
Since: base-4.8.0.0 |
Monad STM |
Since: base-4.3.0.0 |
Monad First |
Since: base-4.8.0.0 |
Monad Last |
Since: base-4.8.0.0 |
Monad Dual |
Since: base-4.8.0.0 |
Monad Sum |
Since: base-4.8.0.0 |
Monad Product |
Since: base-4.8.0.0 |
Monad Down |
Since: base-4.11.0.0 |
Monad ReadP |
Since: base-2.1 |
Monad NonEmpty |
Since: base-4.9.0.0 |
Monad Seq | |
Monad P |
Since: base-2.1 |
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 m => Monad ( WrappedMonad m) |
Since: base-4.7.0.0 |
Defined in Control.Applicative (>>=) :: WrappedMonad m a -> (a -> WrappedMonad m b) -> WrappedMonad m b Source # (>>) :: WrappedMonad m a -> WrappedMonad m b -> WrappedMonad m b Source # return :: a -> WrappedMonad m a Source # |
|
ArrowApply a => Monad ( ArrowMonad a) |
Since: base-2.1 |
Defined in Control.Arrow (>>=) :: ArrowMonad a a0 -> (a0 -> ArrowMonad a b) -> ArrowMonad a b Source # (>>) :: ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a b Source # return :: a0 -> ArrowMonad a a0 Source # |
|
Monad ( Proxy :: Type -> Type ) |
Since: base-4.7.0.0 |
Monad m => Monad ( ListT m) | |
Monad m => Monad ( MaybeT m) | |
Monad f => Monad ( Rec1 f) |
Since: base-4.9.0.0 |
( Monoid a, Monoid b) => Monad ( (,,) a b) |
Since: base-4.14.0.0 |
Monad m => Monad ( Kleisli m a) |
Since: base-4.14.0.0 |
Monad f => Monad ( Ap f) |
Since: base-4.12.0.0 |
Monad f => Monad ( Alt f) |
Since: base-4.8.0.0 |
( Applicative f, Monad f) => Monad ( WhenMissing f x) |
Equivalent to
Since: containers-0.5.9 |
Defined in Data.IntMap.Internal (>>=) :: WhenMissing f x a -> (a -> WhenMissing f x b) -> WhenMissing f x b Source # (>>) :: WhenMissing f x a -> WhenMissing f x b -> WhenMissing f x b Source # return :: a -> WhenMissing f x a Source # |
|
Monad m => Monad ( IdentityT m) | |
( Monad m, Error e) => Monad ( ErrorT e m) | |
Monad m => Monad ( ExceptT e m) | |
Monad m => Monad ( ReaderT r m) | |
Monad m => Monad ( StateT s m) | |
Monad m => Monad ( StateT s m) | |
( Monoid w, Monad m) => Monad ( WriterT w m) | |
( Monoid w, Monad m) => Monad ( WriterT w m) | |
Monad ((->) r :: Type -> Type ) |
Since: base-2.1 |
( Monad f, Monad g) => Monad (f :*: g) |
Since: base-4.9.0.0 |
( Monoid a, Monoid b, Monoid c) => Monad ( (,,,) a b c) |
Since: base-4.14.0.0 |
( Monad f, Monad g) => Monad ( Product f g) |
Since: base-4.9.0.0 |
( Monad f, Applicative f) => Monad ( WhenMatched f x y) |
Equivalent to
Since: containers-0.5.9 |
Defined in Data.IntMap.Internal (>>=) :: WhenMatched f x y a -> (a -> WhenMatched f x y b) -> WhenMatched f x y b Source # (>>) :: WhenMatched f x y a -> WhenMatched f x y b -> WhenMatched f x y b Source # return :: a -> WhenMatched f x y a Source # |
|
( Applicative f, Monad f) => Monad ( WhenMissing f k x) |
Equivalent to
Since: containers-0.5.9 |
Defined in Data.Map.Internal (>>=) :: WhenMissing f k x a -> (a -> WhenMissing f k x b) -> WhenMissing f k x b Source # (>>) :: WhenMissing f k x a -> WhenMissing f k x b -> WhenMissing f k x b Source # return :: a -> WhenMissing f k x a Source # |
|
Monad f => Monad ( M1 i c f) |
Since: base-4.9.0.0 |
( Monad f, Applicative f) => Monad ( WhenMatched f k x y) |
Equivalent to
Since: containers-0.5.9 |
Defined in Data.Map.Internal (>>=) :: WhenMatched f k x y a -> (a -> WhenMatched f k x y b) -> WhenMatched f k x y b Source # (>>) :: WhenMatched f k x y a -> WhenMatched f k x y b -> WhenMatched f k x y b Source # return :: a -> WhenMatched f k x y a Source # |
|
( Monoid w, Monad m) => Monad ( RWST r w s m) | |
( Monoid w, Monad m) => Monad ( RWST r w s m) | |
class ( Alternative m, Monad m) => MonadPlus (m :: Type -> Type ) where Source #
Monads that also support choice and failure.
Nothing
The identity of
mplus
. It should also satisfy the equations
mzero >>= f = mzero v >> mzero = mzero
The default definition is
mzero = empty
mplus :: m a -> m a -> m a Source #
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 Option |
Since: base-4.9.0.0 |
MonadPlus STM |
Since: base-4.3.0.0 |
MonadPlus ReadP |
Since: base-2.1 |
MonadPlus Seq | |
MonadPlus P |
Since: base-2.1 |
MonadPlus ( U1 :: 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 mzero :: ArrowMonad a a0 Source # mplus :: ArrowMonad a a0 -> ArrowMonad a a0 -> ArrowMonad a a0 Source # |
|
MonadPlus ( Proxy :: Type -> Type ) |
Since: base-4.9.0.0 |
Monad m => MonadPlus ( ListT m) | |
Monad m => MonadPlus ( MaybeT m) | |
MonadPlus f => MonadPlus ( Rec1 f) |
Since: base-4.9.0.0 |
MonadPlus m => MonadPlus ( Kleisli m a) |
Since: base-4.14.0.0 |
MonadPlus f => MonadPlus ( Ap f) |
Since: base-4.12.0.0 |
MonadPlus f => MonadPlus ( Alt f) |
Since: base-4.8.0.0 |
MonadPlus m => MonadPlus ( IdentityT m) | |
( Monad m, Error e) => MonadPlus ( ErrorT e m) | |
( Monad m, Monoid e) => MonadPlus ( ExceptT e m) | |
MonadPlus m => MonadPlus ( ReaderT r m) | |
MonadPlus m => MonadPlus ( StateT s m) | |
MonadPlus m => MonadPlus ( StateT s m) | |
( Monoid w, MonadPlus m) => MonadPlus ( WriterT w m) | |
( Monoid w, MonadPlus m) => MonadPlus ( WriterT w m) | |
( 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 |
( Monoid w, MonadPlus m) => MonadPlus ( RWST r w s m) | |
( Monoid w, MonadPlus m) => MonadPlus ( RWST r w s m) | |
(=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 Source #
Same as
>>=
, but with the arguments interchanged.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c infixr 1 Source #
Left-to-right composition of Kleisli arrows.
'
(bs
' can be understood as the
>=>
cs) a
do
expression
do b <- bs a cs b
(>>) :: Monad m => m a -> m b -> m b infixl 1 Source #
Sequentially compose two actions, discarding any value produced by the first, like sequencing operators (such as the semicolon) in imperative languages.
'
as
' can be understood as the
>>
bs
do
expression
do as bs
forever :: Applicative f => f a -> f b Source #
Repeat an action indefinitely.
Using
ApplicativeDo
: '
' can be understood as the
pseudo-
forever
as
do
expression
do as as ..
with
as
repeating.
Examples
A common use of
forever
is to process input from network sockets,
Handle
s, 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
join :: Monad m => m (m a) -> m a Source #
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.
'
' can be understood as the
join
bss
do
expression
do bs <- bss bs
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] Source #
This generalizes the list-based
filter
function.
mapAndUnzipM :: Applicative m => (a -> m (b, c)) -> [a] -> m ([b], [c]) Source #
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 monad.
zipWithM :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m [c] Source #
zipWithM_ :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m () Source #
foldM :: ( Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b Source #
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 () Source #
Like
foldM
, but discards the result.
replicateM :: Applicative m => Int -> m a -> m [a] Source #
performs the action
replicateM
n act
n
times,
gathering the results.
Using
ApplicativeDo
: '
' can be understood as
the
replicateM
5 as
do
expression
do a1 <- as a2 <- as a3 <- as a4 <- as a5 <- as pure [a1,a2,a3,a4,a5]
Note the
Applicative
constraint.
replicateM_ :: Applicative m => Int -> m a -> m () Source #
Like
replicateM
, but discards the result.
concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b] Source #
guard :: Alternative f => Bool -> f () Source #
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
otherwise. For example:
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 () Source #
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.
liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r Source #
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 Source #
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 Source #
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 Source #
Promote a function to a monad, scanning the monadic arguments from
left to right (cf.
liftM2
).