Copyright  (C) 20122013 Edward Kmett 

License  BSDstyle (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.
 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