Copyright  (C) 20122013 Edward Kmett 

License  BSDstyle (see the file LICENSE) 
Maintainer  Edward Kmett <ekmett@gmail.com> 
Stability  provisional 
Portability  GADTs, Rank2Types 
Safe Haskell  SafeInferred 
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
fg
.
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 #