class Monad :: (Type -> Type) -> Constraint
class (Applicative m, Bind m) <= Monad m
The Monad
type class combines the operations of the Bind
and Applicative
type classes. Therefore, Monad
instances represent type constructors which support sequential composition, and also lifting of functions of arbitrary arity.
Instances must satisfy the following laws in addition to the Applicative
and Bind
laws:
pure x >>= f = f x
x >>= pure = x
liftM1 :: forall m a b. Monad m => (a -> b) -> m a -> m b
liftM1
provides a default implementation of (<$>)
for any Monad
, without using (<$>)
as provided by the Functor
-Monad
superclass relationship.
liftM1
can therefore be used to write Functor
instances as follows:
instance functorF :: Functor F where
map = liftM1
#whenM Source
whenM :: forall m. Monad m => m Boolean -> m Unit -> m Unit
Perform a monadic action when a condition is true, where the conditional value is also in a monadic context.
#unlessM SourceunlessM :: forall m. Monad m => m Boolean -> m Unit -> m Unit
Perform a monadic action unless a condition is true, where the conditional value is also in a monadic context.
#ap Sourceap :: forall m a b. Monad m => m (a -> b) -> m a -> m b
ap
provides a default implementation of (<*>)
for any Monad
, without using (<*>)
as provided by the Apply
-Monad
superclass relationship.
ap
can therefore be used to write Apply
instances as follows:
instance applyF :: Apply F where
apply = ap
Re-exports from Control.Applicative #Applicative Source
class Applicative :: (Type -> Type) -> Constraint
class (Apply f) <= Applicative f where
The Applicative
type class extends the Apply
type class with a pure
function, which can be used to create values of type f a
from values of type a
.
Where Apply
provides the ability to lift functions of two or more arguments to functions whose arguments are wrapped using f
, and Functor
provides the ability to lift functions of one argument, pure
can be seen as the function which lifts functions of zero arguments. That is, Applicative
functors support a lifting operation for any number of function arguments.
Instances must satisfy the following laws in addition to the Apply
laws:
(pure identity) <*> v = v
pure (<<<) <*> f <*> g <*> h = f <*> (g <*> h)
(pure f) <*> (pure x) = pure (f x)
u <*> (pure y) = (pure (_ $ y)) <*> u
pure :: forall a. a -> f a
liftA1 :: forall f a b. Applicative f => (a -> b) -> f a -> f b
liftA1
provides a default implementation of (<$>)
for any Applicative
functor, without using (<$>)
as provided by the Functor
-Applicative
superclass relationship.
liftA1
can therefore be used to write Functor
instances as follows:
instance functorF :: Functor F where
map = liftA1
Re-exports from Control.Apply #Apply Source
class Apply :: (Type -> Type) -> Constraint
class (Functor f) <= Apply f where
The Apply
class provides the (<*>)
which is used to apply a function to an argument under a type constructor.
Apply
can be used to lift functions of two or more arguments to work on values wrapped with the type constructor f
. It might also be understood in terms of the lift2
function:
lift2 :: forall f a b c. Apply f => (a -> b -> c) -> f a -> f b -> f c
lift2 f a b = f <$> a <*> b
(<*>)
is recovered from lift2
as lift2 ($)
. That is, (<*>)
lifts the function application operator ($)
to arguments wrapped with the type constructor f
.
Put differently...
foo =
functionTakingNArguments <$> computationProducingArg1
<*> computationProducingArg2
<*> ...
<*> computationProducingArgN
Instances must satisfy the following law in addition to the Functor
laws:
(<<<) <$> f <*> g <*> h = f <*> (g <*> h)
Formally, Apply
represents a strong lax semi-monoidal endofunctor.
apply :: forall a b. f (a -> b) -> f a -> f b
Operator alias for Control.Apply.apply (left-associative / precedence 4)
#(<*) SourceOperator alias for Control.Apply.applyFirst (left-associative / precedence 4)
#(*>) SourceOperator alias for Control.Apply.applySecond (left-associative / precedence 4)
Re-exports from Control.Bind #Bind Sourceclass Bind :: (Type -> Type) -> Constraint
class (Apply m) <= Bind m where
The Bind
type class extends the Apply
type class with a "bind" operation (>>=)
which composes computations in sequence, using the return value of one computation to determine the next computation.
The >>=
operator can also be expressed using do
notation, as follows:
x >>= f = do y <- x
f y
where the function argument of f
is given the name y
.
Instances must satisfy the following laws in addition to the Apply
laws:
(x >>= f) >>= g = x >>= (\k -> f k >>= g)
apply f x = f >>= \f’ -> map f’ x
Associativity tells us that we can regroup operations which use do
notation so that we can unambiguously write, for example:
do x <- m1
y <- m2 x
m3 x y
Members
bind :: forall a b. m a -> (a -> m b) -> m b
join :: forall a m. Bind m => m (m a) -> m a
Collapse two applications of a monadic type constructor into one.
#ifM SourceifM :: forall a m. Bind m => m Boolean -> m a -> m a -> m a
Execute a monadic action if a condition holds.
For example:
main = ifM ((< 0.5) <$> random)
(trace "Heads")
(trace "Tails")
#(>>=) Source
Operator alias for Control.Bind.bind (left-associative / precedence 1)
#(>=>) SourceOperator alias for Control.Bind.composeKleisli (right-associative / precedence 1)
#(=<<) SourceOperator alias for Control.Bind.bindFlipped (right-associative / precedence 1)
#(<=<) SourceOperator alias for Control.Bind.composeKleisliFlipped (right-associative / precedence 1)
Re-exports from Data.Functor #Functor Sourceclass Functor :: (Type -> Type) -> Constraint
class Functor f where
A Functor
is a type constructor which supports a mapping operation map
.
map
can be used to turn functions a -> b
into functions f a -> f b
whose argument and return types use the type constructor f
to represent some computational context.
Instances must satisfy the following laws:
map identity = identity
map (f <<< g) = map f <<< map g
map :: forall a b. (a -> b) -> f a -> f b
void :: forall f a. Functor f => f a -> f Unit
The void
function is used to ignore the type wrapped by a Functor
, replacing it with Unit
and keeping only the type information provided by the type constructor itself.
void
is often useful when using do
notation to change the return type of a monadic computation:
main = forE 1 10 \n -> void do
print n
print (n * n)
#(<$>) Source
Operator alias for Data.Functor.map (left-associative / precedence 4)
#(<$) SourceOperator alias for Data.Functor.voidRight (left-associative / precedence 4)
#(<#>) SourceOperator alias for Data.Functor.mapFlipped (left-associative / precedence 1)
#($>) SourceOperator alias for Data.Functor.voidLeft (left-associative / precedence 4)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4