precursor-0.1.0.0: Prelude replacement

Synopsis

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:

• return a >>= k  =  k a
• m >>= return  =  m
• m >>= (\x -> k x >>= h)  =  (m >>= k) >>= h

Furthermore, the Monad and Applicative operations should relate as follows:

• pure = return
• (<*>) = ap

The above laws imply:

• fmap f xs  =  xs >>= return . f
• (>>) = (*>)

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

(>>=) :: 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.

(>>) :: 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.

return :: a -> m a #

Inject a value into the monadic type.

fail :: String -> m a #

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

# 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 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:
 sum  :: Num a       => [a]   -> a
msum :: MonadPlus m => [m a] -> m a

## Basic Monad functions

(>>=) :: Monad m => forall a b. m a -> (a -> m b) -> m b #

Sequentially compose two actions, passing any value produced by the first as an argument to the second.

(=<<) :: 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 #

(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c infixr 1 #

Right-to-left Kleisli composition of monads. (>=>), with the arguments flipped.

Note how this operator resembles function composition (.):

(.)   ::            (b ->   c) -> (a ->   b) -> a ->   c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c

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.

## Generalisations of list functions

foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b Source #

The foldlM function is analogous to foldl, except that its result is encapsulated in a monad.

      foldlM f a1 [x1, x2, ..., xm]

==

      do
a2 <- f a1 x1
a3 <- f a2 x2
...
f am xm

foldlM_ :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m () Source #

Like foldlM, but discards the result.

foldrM :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b #

Monadic fold over the elements of a structure, associating to the right, i.e. from right to left.

foldrM_ :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m () Source #

Like foldrM, but discards the result.

(<$!>) :: Monad m => (a -> b) -> m a -> m b infixl 4 # Strict version of <$>.

Since: 4.8.0.0

## Avoid

(>>) :: Monad m => forall a b. m a -> m b -> m b #

Sequentially compose two actions, discarding any value produced by the first, like sequencing operators (such as the semicolon) in imperative languages.

fail :: Monad m => forall a. String -> m a #

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.

return :: Monad m => forall a. a -> m a #

Inject a value into the monadic type.