free-5.1.7: Monads for free

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

Control.Applicative.Free

Contents

- Examples

Description

`Applicative` functors for free

Synopsis

- data Ap f a where
  - Pure :: a -> Ap f a
  - Ap :: f a -> Ap f (a -> b) -> Ap f b
- 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 a where #

The free `Applicative` for a `Functor` `f`.

Constructors

Pure :: a -> Ap f a |
Ap :: f a -> Ap f (a -> b) -> Ap f b |

#### Instances

Instances details

Functor (Ap f) # |
Instance details Defined in Control.Applicative.Free Methods fmap :: (a -> b) -> Ap f a -> Ap f b # (<$) :: a -> Ap f b -> Ap f a #
Applicative (Ap f) # |
Instance details Defined in Control.Applicative.Free Methods pure :: a -> Ap f a # (<*>) :: Ap f (a -> b) -> Ap f a -> Ap f b # liftA2 :: (a -> b -> c) -> Ap f a -> Ap f b -> Ap f c # (*>) :: Ap f a -> Ap f b -> Ap f b # (<*) :: Ap f a -> Ap f b -> Ap f a #
Comonad f => Comonad (Ap f) # |
Instance details Defined in Control.Applicative.Free Methods extract :: Ap f a -> a # duplicate :: Ap f a -> Ap f (Ap f a) # extend :: (Ap f a -> b) -> Ap f a -> Ap f b #
Apply (Ap f) # |
Instance details Defined in Control.Applicative.Free Methods (<.>) :: Ap f (a -> b) -> Ap f a -> Ap f b # (.>) :: Ap f a -> Ap f b -> Ap f b # (<.) :: Ap f a -> Ap f b -> Ap f a # liftF2 :: (a -> b -> c) -> Ap f a -> Ap f b -> Ap f c #

runAp :: Applicative g => (forall x. f x -> g x) -> Ap f a -> g a #

Given a natural transformation from `f` to `g`, this gives a canonical monoidal natural transformation from ``Ap` f` to `g`.

    runAp t == retractApp . hoistApp t

runAp_ :: Monoid m => (forall a. f a -> m) -> Ap f b -> m #

Perform a monoidal analysis over free applicative value.

Example:

    count :: Ap f a -> Int
    count = getSum . runAp_ (\_ -> Sum 1)

liftAp :: f a -> Ap f a #

A version of `lift` that can be used with just a `Functor` for `f`.

iterAp :: Functor g => (g a -> a) -> Ap g a -> a #

Tear down a free `Applicative` using iteration.

hoistAp :: (forall a. f a -> g a) -> Ap f b -> Ap g b #

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 #

Interprets the free applicative functor over f using the semantics for `pure` and `<*>` given by the Applicative instance for f.

    retractApp == runAp id

# Examples

Validation form