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
functor transformers for free
Synopsis
- newtype ApT (f :: Type -> Type) (g :: Type -> Type) a = ApT {}
- data ApF (f :: Type -> Type) (g :: Type -> Type) a where
- liftApT :: forall (g :: Type -> Type) f a. Applicative g => f a -> ApT f g a
- liftApO :: forall g a (f :: Type -> Type). Functor g => g a -> ApT f g a
- runApT :: (Applicative h, Functor g) => (forall a. f a -> h a) -> (forall a. g (h a) -> h a) -> ApT f g b -> h b
- runApF :: (Applicative h, Functor g) => (forall a. f a -> h a) -> (forall a. g (h a) -> h a) -> ApF f g b -> h b
- runApT_ :: (Functor g, Monoid m) => (forall a. f a -> m) -> (g m -> m) -> ApT f g b -> m
- hoistApT :: forall (g :: Type -> Type) f f' b. Functor g => (forall a. f a -> f' a) -> ApT f g b -> ApT f' g b
- hoistApF :: forall (g :: Type -> Type) f f' b. Functor g => (forall a. f a -> f' a) -> ApF f g b -> ApF f' g b
- transApT :: forall g g' (f :: Type -> Type) b. Functor g => (forall a. g a -> g' a) -> ApT f g b -> ApT f g' b
- transApF :: forall g g' (f :: Type -> Type) b. Functor g => (forall a. g a -> g' a) -> ApF f g b -> ApF f g' b
- joinApT :: forall m (f :: Type -> Type) a. Monad m => ApT f m a -> m (Ap f a)
- type Ap (f :: Type -> Type) = ApT f Identity
- runAp :: Applicative g => (forall x. f x -> g x) -> Ap f a -> g a
- runAp_ :: Monoid m => (forall x. f x -> m) -> Ap f a -> m
- retractAp :: Applicative f => Ap f a -> f a
- type Alt (f :: Type -> Type) = ApT f []
- runAlt :: forall g (t :: Type -> Type) f a. (Alternative g, Foldable t) => (forall x. f x -> g x) -> ApT f t a -> g a
Documentation
Compared to the free monad transformers, 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.
newtype ApT (f :: Type -> Type) (g :: Type -> Type) a Source #
The free Applicative
transformer for a Functor
f
over
Applicative
g
.
Instances
Alternative g => Alternative (ApT f g) Source # | |
Applicative g => Applicative (ApT f g) Source # | |
Functor g => Functor (ApT f g) Source # | |
Applicative g => Apply (ApT f g) Source # | |
data ApF (f :: Type -> Type) (g :: Type -> Type) a where Source #
The free Applicative
for a Functor
f
.
Pure :: forall a (f :: Type -> Type) (g :: Type -> Type). a -> ApF f g a | |
Ap :: forall (f :: Type -> Type) a1 (g :: Type -> Type) a. f a1 -> ApT f g (a1 -> a) -> ApF f g a |
Instances
Applicative g => Applicative (ApF f g) Source # | |
Functor g => Functor (ApF f g) Source # | |
Applicative g => Apply (ApF f g) Source # | |
liftApT :: forall (g :: Type -> Type) f a. Applicative g => f a -> ApT f g a Source #
A version of lift
that can be used with no constraint for f
.
runApT :: (Applicative h, Functor g) => (forall a. f a -> h a) -> (forall a. g (h a) -> h a) -> ApT f g b -> h b Source #
Given natural transformations f ~> h
and g . h ~> h
this gives
a natural transformation ApT f g ~> h
.
runApF :: (Applicative h, Functor g) => (forall a. f a -> h a) -> (forall a. g (h a) -> h a) -> ApF f g b -> h b Source #
Given natural transformations f ~> h
and g . h ~> h
this gives
a natural transformation ApF f g ~> h
.
hoistApT :: forall (g :: Type -> Type) f f' b. Functor g => (forall a. f a -> f' a) -> ApT f g b -> ApT f' g b Source #
Given a natural transformation from f
to f'
this gives a monoidal natural transformation from ApT f g
to ApT f' g
.
hoistApF :: forall (g :: Type -> Type) f f' b. Functor g => (forall a. f a -> f' a) -> ApF f g b -> ApF f' g b Source #
Given a natural transformation from f
to f'
this gives a monoidal natural transformation from ApF f g
to ApF f' g
.
transApT :: forall g g' (f :: Type -> Type) b. Functor g => (forall a. g a -> g' a) -> ApT f g b -> ApT f g' b Source #
Given a natural transformation from g
to g'
this gives a monoidal natural transformation from ApT f g
to ApT f g'
.
transApF :: forall g g' (f :: Type -> Type) b. Functor g => (forall a. g a -> g' a) -> ApF f g b -> ApF f g' b Source #
Given a natural transformation from g
to g'
this gives a monoidal natural transformation from ApF f g
to ApF f g'
.
joinApT :: forall m (f :: Type -> Type) a. Monad m => ApT f m a -> m (Ap f a) Source #
Pull out and join m
layers of
.ApT
f m a
Free Applicative
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
retractAp :: Applicative f => Ap f a -> f a Source #