free-4.12.4: Monads for free

# free-4.12.4: 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/

Modules

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