<!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.Cont</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-Cont.html");}; //]]> </script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="src/Control-Monad-Trans-Cont.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">transformers-0.2.2.0: Concrete functor and monad transformers</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Portability</th><td>portable</td></tr><tr><th>Stability</th><td>experimental</td></tr><tr><th>Maintainer</th><td>ross@soi.city.ac.uk</td></tr></table><p class="caption">Control.Monad.Trans.Cont</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">The Cont monad </a></li><li><a href="#g:2">The ContT monad transformer </a></li><li><a href="#g:3">Lifting other operations </a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>Continuation monads. </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">type</span> <a href="#t:Cont">Cont</a> r = <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r <a href="Data-Functor-Identity.html#t:Identity">Identity</a></li><li class="src short"><a href="#v:cont">cont</a> :: ((a -> r) -> r) -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a</li><li class="src short"><a href="#v:runCont">runCont</a> :: <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a -> (a -> r) -> r</li><li class="src short"><a href="#v:mapCont">mapCont</a> :: (r -> r) -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a</li><li class="src short"><a href="#v:withCont">withCont</a> :: ((b -> r) -> a -> r) -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r b</li><li class="src short"><span class="keyword">newtype</span> <a href="#t:ContT">ContT</a> r m a = <a href="#v:ContT">ContT</a> {<ul class="subs"><li><a href="#v:runContT">runContT</a> :: (a -> m r) -> m r</li></ul>}</li><li class="src short"><a href="#v:mapContT">mapContT</a> :: (m r -> m r) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a</li><li class="src short"><a href="#v:withContT">withContT</a> :: ((b -> m r) -> a -> m r) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m b</li><li class="src short"><a href="#v:callCC">callCC</a> :: ((a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m b) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a</li><li class="src short"><a href="#v:liftLocal">liftLocal</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m => m r' -> ((r' -> r') -> m r -> m r) -> (r' -> r') -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a</li></ul></div><div id="interface"><h1 id="g:1">The Cont monad </h1><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:Cont" class="def">Cont</a> r = <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r <a href="Data-Functor-Identity.html#t:Identity">Identity</a><a href="src/Control-Monad-Trans-Cont.html#Cont" class="link">Source</a></p><div class="doc"><p>Continuation monad. <code>Cont r a</code> is a CPS computation that produces an intermediate result of type <code>a</code> within a CPS computation whose final result type is <code>r</code>. </p><p>The <code>return</code> function simply creates a continuation which passes the value on. </p><p>The <code>>>=</code> operator adds the bound function into the continuation chain. </p></div></div><div class="top"><p class="src"><a name="v:cont" class="def">cont</a> :: ((a -> r) -> r) -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a<a href="src/Control-Monad-Trans-Cont.html#cont" class="link">Source</a></p><div class="doc"><p>Construct a continuation-passing computation from a function. (The inverse of <code><a href="Control-Monad-Trans-Cont.html#v:runCont">runCont</a></code>.) </p></div></div><div class="top"><p class="src"><a name="v:runCont" class="def">runCont</a><a href="src/Control-Monad-Trans-Cont.html#runCont" class="link">Source</a></p><div class="subs arguments"><p class="caption">Arguments</p><table><tr><td class="src">:: <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a</td><td class="doc"><p>continuation computation (<code>Cont</code>). </p></td></tr><tr><td class="src">-> (a -> r)</td><td class="doc"><p>the final continuation, which produces the final result (often <code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#v:id">id</a></code>). </p></td></tr><tr><td class="src">-> r</td><td class="doc empty"> </td></tr></table></div><div class="doc"><p>Runs a CPS computation, returns its result after applying the final continuation to it. (The inverse of <code><a href="Control-Monad-Trans-Cont.html#v:cont">cont</a></code>.) </p></div></div><div class="top"><p class="src"><a name="v:mapCont" class="def">mapCont</a> :: (r -> r) -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a<a href="src/Control-Monad-Trans-Cont.html#mapCont" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:withCont" class="def">withCont</a> :: ((b -> r) -> a -> r) -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r a -> <a href="Control-Monad-Trans-Cont.html#t:Cont">Cont</a> r b<a href="src/Control-Monad-Trans-Cont.html#withCont" class="link">Source</a></p></div><h1 id="g:2">The ContT monad transformer </h1><div class="top"><p class="src"><span class="keyword">newtype</span> <a name="t:ContT" class="def">ContT</a> r m a <a href="src/Control-Monad-Trans-Cont.html#ContT" class="link">Source</a></p><div class="doc"><p>The continuation monad transformer. Can be used to add continuation handling to other monads. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:ContT" class="def">ContT</a></td><td class="doc empty"> </td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:runContT" class="def">runContT</a> :: (a -> m r) -> m r</dt><dd class="doc empty"> </dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:ContT" class="caption collapser" onclick="toggleSection('i:ContT')">Instances</p><div id="section.i:ContT" class="show"><table><tr><td class="src"><a href="Control-Monad-Trans-Class.html#t:MonadTrans">MonadTrans</a> (<a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> (<a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Functor">Functor</a> (<a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Applicative.html#t:Applicative">Applicative</a> (<a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="Control-Monad-IO-Class.html#t:MonadIO">MonadIO</a> m => <a href="Control-Monad-IO-Class.html#t:MonadIO">MonadIO</a> (<a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m)</td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:mapContT" class="def">mapContT</a> :: (m r -> m r) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a<a href="src/Control-Monad-Trans-Cont.html#mapContT" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:withContT" class="def">withContT</a> :: ((b -> m r) -> a -> m r) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m b<a href="src/Control-Monad-Trans-Cont.html#withContT" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:callCC" class="def">callCC</a> :: ((a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m b) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a) -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a<a href="src/Control-Monad-Trans-Cont.html#callCC" class="link">Source</a></p><div class="doc"><p><code>callCC</code> (call-with-current-continuation) calls its argument function, passing it the current continuation. It provides an escape continuation mechanism for use with continuation monads. Escape continuations one allow to abort the current computation and return a value immediately. They achieve a similar effect to <code>Control.Monad.Trans.Error.throwError</code> and <code>Control.Monad.Trans.Error.catchError</code> within an <code>Control.Monad.Trans.Error.ErrorT</code> monad. The advantage of this function over calling <code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#v:return">return</a></code> is that it makes the continuation explicit, allowing more flexibility and better control. </p><p>The standard idiom used with <code>callCC</code> is to provide a lambda-expression to name the continuation. Then calling the named continuation anywhere within its scope will escape from the computation, even if it is many layers deep within nested computations. </p></div></div><h1 id="g:3">Lifting other operations </h1><div class="top"><p class="src"><a name="v:liftLocal" class="def">liftLocal</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m => m r' -> ((r' -> r') -> m r -> m r) -> (r' -> r') -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a -> <a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a> r m a<a href="src/Control-Monad-Trans-Cont.html#liftLocal" class="link">Source</a></p><div class="doc"><p><code><code><a href="Control-Monad-Trans-Cont.html#v:liftLocal">liftLocal</a></code> ask local</code> yields a <code>local</code> function for <code><code><a href="Control-Monad-Trans-Cont.html#t:ContT">ContT</a></code> r m</code>. </p></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.9.2</p></div></body></html>