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:
https://ekmett.github.io/reader/2008/monads-for-free/
https://ekmett.github.io/reader/2011/free-monads-for-less/