Copyright | (C) 2012-2013 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | GADTs, Rank2Types |
Safe Haskell | Safe |
Language | Haskell2010 |
Final encoding of free
Applicative
functors.
Synopsis
-
newtype
Ap
f a =
Ap
{
- _runAp :: forall g. Applicative g => ( forall x. f x -> g x) -> g a
- runAp :: Applicative g => ( forall x. f x -> g x) -> Ap f a -> g a
- runAp_ :: Monoid m => ( forall a. f a -> m) -> Ap f b -> m
- liftAp :: f a -> Ap f a
- hoistAp :: ( forall a. f a -> g a) -> Ap f b -> Ap g b
- retractAp :: Applicative f => Ap f a -> f a
Documentation
Compared to the free monad, they are less expressive. However, they are also more flexible to inspect and interpret, as the number of ways in which the values can be nested is more limited.
The free
Applicative
for a
Functor
f
.
Ap | |
|
runAp :: Applicative g => ( forall x. f x -> g x) -> Ap f a -> g a Source #
Given a natural transformation from
f
to
g
, this gives a canonical monoidal natural transformation from
to
Ap
f
g
.
runAp t == retractApp . hoistApp t
runAp_ :: Monoid m => ( forall a. f a -> m) -> Ap f b -> m Source #
Perform a monoidal analysis over free applicative value.
Example:
count :: Ap f a -> Int count = getSum . runAp_ (\_ -> Sum 1)
hoistAp :: ( forall a. f a -> g a) -> Ap f b -> Ap g b Source #
Given a natural transformation from
f
to
g
this gives a monoidal natural transformation from
Ap f
to
Ap g
.
retractAp :: Applicative f => Ap f a -> f a Source #