free-5.1.7: Monads for free

# free-5.1.7: Monads for free

Free monads are useful for many tree-like structures and domain specific languages.

If `f` is a `Functor` then the free `Monad` on `f` is the type of trees whose nodes are labeled with the constructors of `f`. The word "free" is used in the sense of "unrestricted" rather than "zero-cost": `Free f` makes no constraining assumptions beyond those given by `f` and the definition of `Monad`. As used here it is a standard term from the mathematical theory of adjoint functors.

Cofree comonads are dual to free monads. They provide convenient ways to talk about branching streams and rose-trees, and can be used to annotate syntax trees. The cofree comonad can be seen as a stream parameterized by a `Functor` that controls its branching factor.

More information on free monads, including examples, can be found in the following blog posts: http://comonad.com/reader/2008/monads-for-free/ http://comonad.com/reader/2011/free-monads-for-less/

Signatures

Modules

- Control
  Submodules
  - Alternative
    Submodules
    - Control.Alternative.Free
      Submodules
      - Control.Alternative.Free.Final
  - Applicative
    Submodules
    - Control.Applicative.Free
      Submodules
      - Control.Applicative.Free.Fast
      - Control.Applicative.Free.Final
    - Trans
      Submodules
      - Control.Applicative.Trans.Free
  - Comonad
    Submodules
    - Control.Comonad.Cofree
      Submodules
      - Control.Comonad.Cofree.Class
    - Trans
      Submodules
      - Control.Comonad.Trans.Cofree
      - Control.Comonad.Trans.Coiter
  - Monad
    Submodules
    - Control.Monad.Free
      Submodules
      - Control.Monad.Free.Ap
      - Control.Monad.Free.Church
      - Control.Monad.Free.Class
      - Control.Monad.Free.TH
    - Trans
      Submodules
      - Control.Monad.Trans.Free
        Submodules
        - Control.Monad.Trans.Free.Ap
        - Control.Monad.Trans.Free.Church
      - Control.Monad.Trans.Iter