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 |
Applicative
functors for free
Synopsis
- data Ap (f :: Type -> Type) a where
- 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
- iterAp :: Functor g => (g a -> a) -> Ap g a -> 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.
See Free Applicative Functors, by Paolo Capriotti and Ambrus Kaposi, for some applications.
data Ap (f :: Type -> Type) a where Source #
The free Applicative
for a Functor
f
.
Pure :: forall a (f :: Type -> Type). a -> Ap f a | |
Ap :: forall (f :: Type -> Type) a1 a. f a1 -> Ap f (a1 -> a) -> Ap f a |
Instances
Foldable f => Foldable (Ap f) Source # | foldMap f == foldMap f . |
Defined in Control.Applicative.Free fold :: Monoid m => Ap f m -> m # foldMap :: Monoid m => (a -> m) -> Ap f a -> m # foldMap' :: Monoid m => (a -> m) -> Ap f a -> m # foldr :: (a -> b -> b) -> b -> Ap f a -> b # foldr' :: (a -> b -> b) -> b -> Ap f a -> b # foldl :: (b -> a -> b) -> b -> Ap f a -> b # foldl' :: (b -> a -> b) -> b -> Ap f a -> b # foldr1 :: (a -> a -> a) -> Ap f a -> a # foldl1 :: (a -> a -> a) -> Ap f a -> a # elem :: Eq a => a -> Ap f a -> Bool # maximum :: Ord a => Ap f a -> a # | |
Foldable1 f => Foldable1 (Ap f) Source # | foldMap f == foldMap f . |
Defined in Control.Applicative.Free fold1 :: Semigroup m => Ap f m -> m # foldMap1 :: Semigroup m => (a -> m) -> Ap f a -> m # foldMap1' :: Semigroup m => (a -> m) -> Ap f a -> m # toNonEmpty :: Ap f a -> NonEmpty a # maximum :: Ord a => Ap f a -> a # minimum :: Ord a => Ap f a -> a # foldrMap1 :: (a -> b) -> (a -> b -> b) -> Ap f a -> b # foldlMap1' :: (a -> b) -> (b -> a -> b) -> Ap f a -> b # foldlMap1 :: (a -> b) -> (b -> a -> b) -> Ap f a -> b # foldrMap1' :: (a -> b) -> (a -> b -> b) -> Ap f a -> b # | |
Eq1 f => Eq1 (Ap f) Source # | |
Ord1 f => Ord1 (Ap f) Source # | |
Defined in Control.Applicative.Free | |
Applicative (Ap f) Source # | |
Functor (Ap f) Source # | |
Comonad f => Comonad (Ap f) Source # | |
Apply (Ap f) Source # | |
(Eq1 f, Eq a) => Eq (Ap f a) Source # | |
(Ord1 f, Ord a) => Ord (Ap f a) Source # | |
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)
iterAp :: Functor g => (g a -> a) -> Ap g a -> a Source #
Tear down a free Applicative
using iteration.
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 #