This file is indexed.

/usr/share/doc/libghc-free-doc/html/Control-Monad-Trans-Free-Church.html is in libghc-free-doc 4.12.1-2build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Control.Monad.Trans.Free.Church</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[
window.onload = function () {pageLoad();setSynopsis("mini_Control-Monad-Trans-Free-Church.html");};
//]]>
</script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="src/Control-Monad-Trans-Free-Church.html">Source</a></li><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">free-4.12.1: Monads for free</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Copyright</th><td>(C) 2008-2014 Edward Kmett</td></tr><tr><th>License</th><td>BSD-style (see the file LICENSE)</td></tr><tr><th>Maintainer</th><td>Edward Kmett &lt;ekmett@gmail.com&gt;</td></tr><tr><th>Stability</th><td>provisional</td></tr><tr><th>Portability</th><td>non-portable (rank-2 polymorphism, MTPCs)</td></tr><tr><th>Safe Haskell</th><td>Safe</td></tr><tr><th>Language</th><td>Haskell2010</td></tr></table><p class="caption">Control.Monad.Trans.Free.Church</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">The free monad transformer</a></li><li><a href="#g:2">The free monad</a></li><li><a href="#g:3">Operations</a></li><li><a href="#g:4">Operations of free monad</a></li><li><a href="#g:5">Free Monads With Class</a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>Church-encoded free monad transformer.</p></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">newtype</span> <a href="#t:FT">FT</a> f m a = <a href="#v:FT">FT</a> {<ul class="subs"><li><a href="#v:runFT">runFT</a> :: <span class="keyword">forall</span> r. (a -&gt; m r) -&gt; (<span class="keyword">forall</span> x. (x -&gt; m r) -&gt; f x -&gt; m r) -&gt; m r</li></ul>}</li><li class="src short"><span class="keyword">type</span> <a href="#t:F">F</a> f = <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor-Identity.html#t:Identity">Identity</a></li><li class="src short"><a href="#v:free">free</a> :: (<span class="keyword">forall</span> r. (a -&gt; r) -&gt; (f r -&gt; r) -&gt; r) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a</li><li class="src short"><a href="#v:runF">runF</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; <span class="keyword">forall</span> r. (a -&gt; r) -&gt; (f r -&gt; r) -&gt; r</li><li class="src short"><a href="#v:improveT">improveT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; (<span class="keyword">forall</span> t. <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (t m) =&gt; t m a) -&gt; <a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a</li><li class="src short"><a href="#v:toFT">toFT</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a</li><li class="src short"><a href="#v:fromFT">fromFT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; <a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a</li><li class="src short"><a href="#v:iterT">iterT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; (f (m a) -&gt; m a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; m a</li><li class="src short"><a href="#v:iterTM">iterTM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Class.html#t:MonadTrans">MonadTrans</a> t, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> (t m)) =&gt; (f (t m a) -&gt; t m a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; t m a</li><li class="src short"><a href="#v:hoistFT">hoistFT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> n) =&gt; (<span class="keyword">forall</span> a. m a -&gt; n a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m b -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f n b</li><li class="src short"><a href="#v:transFT">transFT</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; (<span class="keyword">forall</span> a. f a -&gt; g a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m b -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> g m b</li><li class="src short"><a href="#v:joinFT">joinFT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Traversable.html#t:Traversable">Traversable</a> f) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; m (<a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a)</li><li class="src short"><a href="#v:cutoff">cutoff</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Prelude.html#t:Integer">Integer</a> -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Maybe.html#t:Maybe">Maybe</a> a)</li><li class="src short"><a href="#v:improve">improve</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; (<span class="keyword">forall</span> m. <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m =&gt; m a) -&gt; <a href="Control-Monad-Trans-Free.html#t:Free">Free</a> f a</li><li class="src short"><a href="#v:fromF">fromF</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; m a</li><li class="src short"><a href="#v:toF">toF</a> :: <a href="Control-Monad-Trans-Free.html#t:Free">Free</a> f a -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a</li><li class="src short"><a href="#v:retract">retract</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> f) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; f a</li><li class="src short"><a href="#v:retractT">retractT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Class.html#t:MonadTrans">MonadTrans</a> t, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> (t m), <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> (t m) m a -&gt; t m a</li><li class="src short"><a href="#v:iter">iter</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; (f a -&gt; a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; a</li><li class="src short"><a href="#v:iterM">iterM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; (f (m a) -&gt; m a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; m a</li><li class="src short"><span class="keyword">class</span> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="#t:MonadFree">MonadFree</a> f m | m -&gt; f <span class="keyword">where</span><ul class="subs"><li><a href="#v:wrap">wrap</a> :: f (m a) -&gt; m a</li></ul></li><li class="src short"><a href="#v:liftF">liftF</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; f a -&gt; m a</li></ul></div><div id="interface"><h1 id="g:1">The free monad transformer</h1><div class="top"><p class="src"><span class="keyword">newtype</span> <a name="t:FT" class="def">FT</a> f m a <a href="src/Control-Monad-Trans-Free-Church.html#FT" class="link">Source</a></p><div class="doc"><p>The &quot;free monad transformer&quot; for a functor <code>f</code></p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:FT" class="def">FT</a></td><td class="doc empty">&nbsp;</td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:runFT" class="def">runFT</a> :: <span class="keyword">forall</span> r. (a -&gt; m r) -&gt; (<span class="keyword">forall</span> x. (x -&gt; m r) -&gt; f x -&gt; m r) -&gt; m r</dt><dd class="doc empty">&nbsp;</dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:FT" class="caption collapser" onclick="toggleSection('i:FT')">Instances</p><div id="section.i:FT" class="show"><table><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Error-Class.html#t:MonadError">MonadError</a> e m) =&gt; <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Error-Class.html#t:MonadError">MonadError</a> e (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-144" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Reader-Class.html#t:MonadReader">MonadReader</a> r m) =&gt; <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Reader-Class.html#t:MonadReader">MonadReader</a> r (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-152" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-State-Class.html#t:MonadState">MonadState</a> s m) =&gt; <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-State-Class.html#t:MonadState">MonadState</a> s (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-168" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Writer-Class.html#t:MonadWriter">MonadWriter</a> w m) =&gt; <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Writer-Class.html#t:MonadWriter">MonadWriter</a> w (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-158" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-106" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Class.html#t:MonadTrans">MonadTrans</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-109" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-102" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-89" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Applicative.html#t:Applicative">Applicative</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-95" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Foldable.html#t:Foldable">Foldable</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Foldable.html#t:Foldable">Foldable</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Foldable.html#t:Foldable">Foldable</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-120" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Traversable.html#t:Traversable">Traversable</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Traversable.html#t:Traversable">Traversable</a> f) =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Traversable.html#t:Traversable">Traversable</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-134" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Applicative.html#t:Alternative">Alternative</a> m =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Applicative.html#t:Alternative">Alternative</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-112" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:MonadPlus">MonadPlus</a> m =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:MonadPlus">MonadPlus</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-116" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/libghc-exceptions-doc/html/Control-Monad-Catch.html#t:MonadThrow">MonadThrow</a> m =&gt; <a href="file:///usr/share/doc/libghc-exceptions-doc/html/Control-Monad-Catch.html#t:MonadThrow">MonadThrow</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-178" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/libghc-exceptions-doc/html/Control-Monad-Catch.html#t:MonadCatch">MonadCatch</a> m) =&gt; <a href="file:///usr/share/doc/libghc-exceptions-doc/html/Control-Monad-Catch.html#t:MonadCatch">MonadCatch</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-182" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-IO-Class.html#t:MonadIO">MonadIO</a> m =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-IO-Class.html#t:MonadIO">MonadIO</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-140" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Cont-Class.html#t:MonadCont">MonadCont</a> m =&gt; <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Cont-Class.html#t:MonadCont">MonadCont</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-149" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/libghc-semigroupoids-doc/html/Data-Functor-Apply.html#t:Apply">Apply</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-92" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/libghc-semigroupoids-doc/html/Data-Functor-Bind.html#t:Bind">Bind</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-99" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Eq.html#t:Eq">Eq</a> (<a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a)) =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Eq.html#t:Eq">Eq</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-83" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Ord.html#t:Ord">Ord</a> (<a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a)) =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Ord.html#t:Ord">Ord</a> (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a)</span> <a href="src/Control-Monad-Trans-Free-Church.html#line-86" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><h1 id="g:2">The free monad</h1><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:F" class="def">F</a> f = <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor-Identity.html#t:Identity">Identity</a> <a href="src/Control-Monad-Trans-Free-Church.html#F" class="link">Source</a></p><div class="doc"><p>The &quot;free monad&quot; for a functor <code>f</code>.</p></div></div><div class="top"><p class="src"><a name="v:free" class="def">free</a> :: (<span class="keyword">forall</span> r. (a -&gt; r) -&gt; (f r -&gt; r) -&gt; r) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a <a href="src/Control-Monad-Trans-Free-Church.html#free" class="link">Source</a></p><div class="doc"><p>Wrap a Church-encoding of a &quot;free monad&quot; as the free monad for a functor.</p></div></div><div class="top"><p class="src"><a name="v:runF" class="def">runF</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; <span class="keyword">forall</span> r. (a -&gt; r) -&gt; (f r -&gt; r) -&gt; r <a href="src/Control-Monad-Trans-Free-Church.html#runF" class="link">Source</a></p><div class="doc"><p>Unwrap the <code><a href="Control-Monad-Trans-Free.html#t:Free">Free</a></code> monad to obtain it's Church-encoded representation.</p></div></div><h1 id="g:3">Operations</h1><div class="top"><p class="src"><a name="v:improveT" class="def">improveT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; (<span class="keyword">forall</span> t. <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (t m) =&gt; t m a) -&gt; <a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a <a href="src/Control-Monad-Trans-Free-Church.html#improveT" class="link">Source</a></p><div class="doc"><p>Improve the asymptotic performance of code that builds a free monad transformer
 with only binds and returns by using <code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> behind the scenes.</p><p>Similar to <code><a href="Control-Monad-Trans-Free-Church.html#v:improve">improve</a></code>.</p></div></div><div class="top"><p class="src"><a name="v:toFT" class="def">toFT</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a <a href="src/Control-Monad-Trans-Free-Church.html#toFT" class="link">Source</a></p><div class="doc"><p>Generate a Church-encoded free monad transformer from a <code><a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a></code> monad
 transformer.</p></div></div><div class="top"><p class="src"><a name="v:fromFT" class="def">fromFT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; <a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m a <a href="src/Control-Monad-Trans-Free-Church.html#fromFT" class="link">Source</a></p><div class="doc"><p>Convert to a <code><a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a></code> free monad representation.</p></div></div><div class="top"><p class="src"><a name="v:iterT" class="def">iterT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; (f (m a) -&gt; m a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; m a <a href="src/Control-Monad-Trans-Free-Church.html#iterT" class="link">Source</a></p><div class="doc"><p>Tear down a free monad transformer using iteration.</p></div></div><div class="top"><p class="src"><a name="v:iterTM" class="def">iterTM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Class.html#t:MonadTrans">MonadTrans</a> t, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> (t m)) =&gt; (f (t m a) -&gt; t m a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; t m a <a href="src/Control-Monad-Trans-Free-Church.html#iterTM" class="link">Source</a></p><div class="doc"><p>Tear down a free monad transformer using iteration over a transformer.</p></div></div><div class="top"><p class="src"><a name="v:hoistFT" class="def">hoistFT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> n) =&gt; (<span class="keyword">forall</span> a. m a -&gt; n a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m b -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f n b <a href="src/Control-Monad-Trans-Free-Church.html#hoistFT" class="link">Source</a></p><div class="doc"><p>Lift a monad homomorphism from <code>m</code> to <code>n</code> into a monad homomorphism from <code><code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> f m</code> to <code><code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> f n</code></p><pre><code><a href="Control-Monad-Trans-Free-Church.html#v:hoistFT">hoistFT</a></code> :: (<code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> m, <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> n, <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a></code> f) =&gt; (m ~&gt; n) -&gt; <code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> f m ~&gt; <code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> f n</pre></div></div><div class="top"><p class="src"><a name="v:transFT" class="def">transFT</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; (<span class="keyword">forall</span> a. f a -&gt; g a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m b -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> g m b <a href="src/Control-Monad-Trans-Free-Church.html#transFT" class="link">Source</a></p><div class="doc"><p>Lift a natural transformation from <code>f</code> to <code>g</code> into a monad homomorphism from <code><code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> f m</code> to <code><code><a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a></code> g n</code></p></div></div><div class="top"><p class="src"><a name="v:joinFT" class="def">joinFT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Traversable.html#t:Traversable">Traversable</a> f) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; m (<a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a) <a href="src/Control-Monad-Trans-Free-Church.html#joinFT" class="link">Source</a></p><div class="doc"><p>Pull out and join <code>m</code> layers of <code><code><a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a></code> f m a</code>.</p></div></div><div class="top"><p class="src"><a name="v:cutoff" class="def">cutoff</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Prelude.html#t:Integer">Integer</a> -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m a -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Maybe.html#t:Maybe">Maybe</a> a) <a href="src/Control-Monad-Trans-Free-Church.html#cutoff" class="link">Source</a></p><div class="doc"><p>Cuts off a tree of computations at a given depth.
 If the depth is 0 or less, no computation nor
 monadic effects will take place.</p><p>Some examples (n &#8805; 0):</p><pre>cutoff 0     _        == return Nothing</pre><pre>cutoff (n+1) . return == return . Just</pre><pre>cutoff (n+1) . lift   ==   lift . liftM Just</pre><pre>cutoff (n+1) . wrap   ==  wrap . fmap (cutoff n)</pre><p>Calling 'retract . cutoff n' is always terminating, provided each of the
 steps in the iteration is terminating.</p></div></div><h1 id="g:4">Operations of free monad</h1><div class="top"><p class="src"><a name="v:improve" class="def">improve</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; (<span class="keyword">forall</span> m. <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m =&gt; m a) -&gt; <a href="Control-Monad-Trans-Free.html#t:Free">Free</a> f a <a href="src/Control-Monad-Trans-Free-Church.html#improve" class="link">Source</a></p><div class="doc"><p>Improve the asymptotic performance of code that builds a free monad with only binds and returns by using <code><a href="Control-Monad-Trans-Free-Church.html#t:F">F</a></code> behind the scenes.</p><p>This is based on the &quot;Free Monads for Less&quot; series of articles by Edward Kmett:</p><p><a href="http://comonad.com/reader/2011/free-monads-for-less/">http://comonad.com/reader/2011/free-monads-for-less/</a>
 <a href="http://comonad.com/reader/2011/free-monads-for-less-2/">http://comonad.com/reader/2011/free-monads-for-less-2/</a></p><p>and &quot;Asymptotic Improvement of Computations over Free Monads&quot; by Janis Voightl&#228;nder:</p><p><a href="http://www.iai.uni-bonn.de/~jv/mpc08.pdf">http://www.iai.uni-bonn.de/~jv/mpc08.pdf</a></p></div></div><div class="top"><p class="src"><a name="v:fromF" class="def">fromF</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; m a <a href="src/Control-Monad-Trans-Free-Church.html#fromF" class="link">Source</a></p><div class="doc"><p>Convert to another free monad representation.</p></div></div><div class="top"><p class="src"><a name="v:toF" class="def">toF</a> :: <a href="Control-Monad-Trans-Free.html#t:Free">Free</a> f a -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a <a href="src/Control-Monad-Trans-Free-Church.html#toF" class="link">Source</a></p><div class="doc"><p>Generate a Church-encoded free monad from a <code><a href="Control-Monad-Trans-Free.html#t:Free">Free</a></code> monad.</p></div></div><div class="top"><p class="src"><a name="v:retract" class="def">retract</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> f) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; f a <a href="src/Control-Monad-Trans-Free-Church.html#retract" class="link">Source</a></p><div class="doc"><p><code><a href="Control-Monad-Trans-Free-Church.html#v:retract">retract</a></code> is the left inverse of <code><a href="Control-Monad-Trans-Free-Church.html#v:liftF">liftF</a></code></p><pre><code><a href="Control-Monad-Trans-Free-Church.html#v:retract">retract</a></code> . <code><a href="Control-Monad-Trans-Free-Church.html#v:liftF">liftF</a></code> = <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Function.html#v:id">id</a></code>
</pre></div></div><div class="top"><p class="src"><a name="v:retractT" class="def">retractT</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Class.html#t:MonadTrans">MonadTrans</a> t, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> (t m), <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> (t m) m a -&gt; t m a <a href="src/Control-Monad-Trans-Free-Church.html#retractT" class="link">Source</a></p><div class="doc"><p>Tear down a free monad transformer using iteration over a transformer.</p></div></div><div class="top"><p class="src"><a name="v:iter" class="def">iter</a> :: <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; (f a -&gt; a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; a <a href="src/Control-Monad-Trans-Free-Church.html#iter" class="link">Source</a></p><div class="doc"><p>Tear down an <code><a href="Control-Monad-Trans-Free-Church.html#t:F">F</a></code> <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> using iteration.</p></div></div><div class="top"><p class="src"><a name="v:iterM" class="def">iterM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; (f (m a) -&gt; m a) -&gt; <a href="Control-Monad-Trans-Free-Church.html#t:F">F</a> f a -&gt; m a <a href="src/Control-Monad-Trans-Free-Church.html#iterM" class="link">Source</a></p><div class="doc"><p>Like <code><a href="Control-Monad-Trans-Free-Church.html#v:iter">iter</a></code> for monadic values.</p></div></div><h1 id="g:5">Free Monads With Class</h1><div class="top"><p class="src"><span class="keyword">class</span> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; <a name="t:MonadFree" class="def">MonadFree</a> f m | m -&gt; f <span class="keyword">where</span> <a href="src/Control-Monad-Free-Class.html#MonadFree" class="link">Source</a></p><div class="doc"><p>Monads provide substitution (<code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#v:fmap">fmap</a></code>) and renormalization (<code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:join">join</a></code>):</p><pre>m <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> f = <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:join">join</a></code> (<code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#v:fmap">fmap</a></code> f m)</pre><p>A free <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> is one that does no work during the normalization step beyond simply grafting the two monadic values together.</p><p><code>[]</code> is not a free <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> (in this sense) because <code><code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:join">join</a></code> [[a]]</code> smashes the lists flat.</p><p>On the other hand, consider:</p><pre>data Tree a = Bin (Tree a) (Tree a) | Tip a
</pre><pre>instance <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> Tree where
  <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:return">return</a></code> = Tip
  Tip a <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> f = f a
  Bin l r <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> f = Bin (l <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> f) (r <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> f)
</pre><p>This <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> is the free <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> of Pair:</p><pre>data Pair a = Pair a a
</pre><p>And we could make an instance of <code><a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a></code> for it directly:</p><pre>instance <code><a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a></code> Pair Tree where
   <code><a href="Control-Monad-Trans-Free-Church.html#v:wrap">wrap</a></code> (Pair l r) = Bin l r
</pre><p>Or we could choose to program with <code><code><a href="Control-Monad-Free.html#v:Free">Free</a></code> Pair</code> instead of <code>Tree</code>
 and thereby avoid having to define our own <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code> instance.</p><p>Moreover, <a href="Control-Monad-Free-Church.html">Control.Monad.Free.Church</a> provides a <code><a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a></code>
 instance that can improve the <em>asymptotic</em> complexity of code that
 constructs free monads by effectively reassociating the use of
 (<code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code>). You may also want to take a look at the <code>kan-extensions</code>
 package (<a href="http://hackage.haskell.org/package/kan-extensions">http://hackage.haskell.org/package/kan-extensions</a>).</p><p>See <code><a href="Control-Monad-Free.html#v:Free">Free</a></code> for a more formal definition of the free <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a></code>
 for a <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a></code>.</p></div><div class="subs minimal"><p class="caption">Minimal complete definition</p><p class="src">Nothing</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:wrap" class="def">wrap</a> :: f (m a) -&gt; m a <a href="src/Control-Monad-Free-Class.html#wrap" class="link">Source</a></p><div class="doc"><p>Add a layer.</p><pre>wrap (fmap f x) &#8801; wrap (fmap return x) &gt;&gt;= f
</pre></div></div><div class="subs instances"><p id="control.i:MonadFree" class="caption collapser" onclick="toggleSection('i:MonadFree')">Instances</p><div id="section.i:MonadFree" class="show"><table><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-List.html#t:ListT">ListT</a> m)</span> <a href="src/Control-Monad-Free-Class.html#line-141" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-comonad-doc/html/Control-Comonad-Trans-Identity.html#t:IdentityT">IdentityT</a> m)</span> <a href="src/Control-Monad-Free-Class.html#line-138" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/ghc-doc/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Maybe.html#t:MaybeT">MaybeT</a> m)</span> <a href="src/Control-Monad-Free-Class.html#line-135" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="Control-Monad-Free.html#t:Free">Free</a> f)</span> <a href="src/Control-Monad-Free-Class.html#line-286" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="Control-Monad-Free-Church.html#t:F">F</a> f)</span> <a href="src/Control-Monad-Free-Class.html#line-138" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor-Identity.html#t:Identity">Identity</a> (<a href="Control-Monad-Trans-Iter.html#t:IterT">IterT</a> m)</span> <a href="src/Control-Monad-Free-Class.html#line-276" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m, <a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Error-Class.html#t:Error">Error</a> e) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Error.html#t:ErrorT">ErrorT</a> e m)</span> <a href="src/Control-Monad-Free-Class.html#line-144" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Monoid.html#t:Monoid">Monoid</a> w) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Writer-Strict.html#t:WriterT">WriterT</a> w m)</span> <a href="src/Control-Monad-Free-Class.html#line-126" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Monoid.html#t:Monoid">Monoid</a> w) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Writer-Lazy.html#t:WriterT">WriterT</a> w m)</span> <a href="src/Control-Monad-Free-Class.html#line-123" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Cont.html#t:ContT">ContT</a> r m)</span> <a href="src/Control-Monad-Free-Class.html#line-120" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-State-Strict.html#t:StateT">StateT</a> s m)</span> <a href="src/Control-Monad-Free-Class.html#line-117" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-State-Lazy.html#t:StateT">StateT</a> s m)</span> <a href="src/Control-Monad-Free-Class.html#line-114" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-Reader.html#t:ReaderT">ReaderT</a> e m)</span> <a href="src/Control-Monad-Free-Class.html#line-111" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Control-Monad.html#t:Monad">Monad</a> m) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="Control-Monad-Trans-Free.html#t:FreeT">FreeT</a> f m)</span> <a href="src/Control-Monad-Free-Class.html#line-294" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left"><a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="Control-Monad-Trans-Free-Church.html#t:FT">FT</a> f m)</span> <a href="src/Control-Monad-Free-Class.html#line-106" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Monoid.html#t:Monoid">Monoid</a> w) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-RWS-Lazy.html#t:RWST">RWST</a> r w s m)</span> <a href="src/Control-Monad-Free-Class.html#line-132" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Monoid.html#t:Monoid">Monoid</a> w) =&gt; <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f (<a href="file:///usr/share/doc/libghc-mtl-doc/html/Control-Monad-RWS-Strict.html#t:RWST">RWST</a> r w s m)</span> <a href="src/Control-Monad-Free-Class.html#line-129" class="link">Source</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:liftF" class="def">liftF</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.8.2.0/Data-Functor.html#t:Functor">Functor</a> f, <a href="Control-Monad-Trans-Free-Church.html#t:MonadFree">MonadFree</a> f m) =&gt; f a -&gt; m a <a href="src/Control-Monad-Free-Class.html#liftF" class="link">Source</a></p><div class="doc"><p>A version of lift that can be used with just a Functor for f.</p></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.16.1</p></div></body></html>