<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments for Melding Monads</title>
	<atom:link href="http://blog.melding-monads.com/comments/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.melding-monads.com</link>
	<description>Math, Computer Science,  and Education</description>
	<lastBuildDate>Thu, 22 Jul 2010 12:20:42 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>Comment on Iteratees and a (very) Minimal Model of Shared-State Concurrency by Aycan iRiCAN</title>
		<link>http://blog.melding-monads.com/2010/07/21/iteratees-and-a-very-minimal-model-of-shared-state-concurrency/#comment-95</link>
		<dc:creator>Aycan iRiCAN</dc:creator>
		<pubDate>Thu, 22 Jul 2010 12:20:42 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=287#comment-95</guid>
		<description>take a look at IterateeMCPS by Oleg.</description>
		<content:encoded><![CDATA[<p>take a look at IterateeMCPS by Oleg.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Iteratees and a (very) Minimal Model of Shared-State Concurrency by Heinrich Apfelmus</title>
		<link>http://blog.melding-monads.com/2010/07/21/iteratees-and-a-very-minimal-model-of-shared-state-concurrency/#comment-94</link>
		<dc:creator>Heinrich Apfelmus</dc:creator>
		<pubDate>Thu, 22 Jul 2010 11:23:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=287#comment-94</guid>
		<description>I think that iteratees are too ad-hoc for this problem of defining a monad with custom semantics. A more general and conceptually simpler method is to implement the operational semantics directly, for example along the lines of my &quot;Operational Monad Tutorial&quot;.

Two demonstrations of this operational style that involve scheduling are &lt;a href=&quot;http://projects.haskell.org/operational/examples/PoorMansConcurrency.hs.html&quot; rel=&quot;nofollow&quot;&gt;Poor Man&#039;s Concurrency Monad&lt;/a&gt; and a &lt;a href=&quot;http://projects.haskell.org/operational/examples/TicTacToe.hs.html&quot; rel=&quot;nofollow&quot;&gt;aTicTacToe implementation&lt;/a&gt;. See the &lt;a href=&quot;http://projects.haskell.org/operational&quot; rel=&quot;nofollow&quot;&gt;project web site&lt;/a&gt; for more examples.</description>
		<content:encoded><![CDATA[<p>I think that iteratees are too ad-hoc for this problem of defining a monad with custom semantics. A more general and conceptually simpler method is to implement the operational semantics directly, for example along the lines of my &#8220;Operational Monad Tutorial&#8221;.</p>
<p>Two demonstrations of this operational style that involve scheduling are <a href="http://projects.haskell.org/operational/examples/PoorMansConcurrency.hs.html" rel="nofollow">Poor Man&#8217;s Concurrency Monad</a> and a <a href="http://projects.haskell.org/operational/examples/TicTacToe.hs.html" rel="nofollow">aTicTacToe implementation</a>. See the <a href="http://projects.haskell.org/operational" rel="nofollow">project web site</a> for more examples.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Iteratees and a (very) Minimal Model of Shared-State Concurrency by Jeremy Shaw</title>
		<link>http://blog.melding-monads.com/2010/07/21/iteratees-and-a-very-minimal-model-of-shared-state-concurrency/#comment-92</link>
		<dc:creator>Jeremy Shaw</dc:creator>
		<pubDate>Thu, 22 Jul 2010 00:49:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=287#comment-92</guid>
		<description>Great stuff! These concepts are being used in the latest version of sendfile and happstack now.

You can see my write-up on how it is used in sendfile here,

http://happstack.blogspot.com/2010/07/sendfile-071.html

I would love to hear what you have to say about it. 

For sendfile, the library provides a &#039;recursive&#039; function, but the user needs to be able to do some stuff between each recursion. The user of sendfile library cares about controlling when the function is resumed, and working with the intermediate values. But it does not want to know about the internals of the sendfile function or what data needs to be propogated from one call to the next. The Iter provides a great way of doing this. (And allows us to hide the fact that the data which needs to be propogated is platform dependent).

In happstack, it used so that users can provide functions which process the contents of multipart/form-data and impose quotas, and decide if a value should be stored in RAM or saved on the disk. And, it needs to be able to do it in &#039;constant&#039; space. I have not documented this feature in detail yet but you can see the code here:

http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-server/src/Happstack/Server/HTTP/Multipart.hs

Search for InputIter.

In this case, the user provides the function that does the work, but the happstack library needs to do things in-between recursions.  But the &#039;private&#039; data which needs to be passed each recursion can be different for different functions. Once again the Iter allows those differences to be wrapped up and hidden. But this time it is so that the library code can avoid having to know the inner details and can work with them in a generic manner.

I still hope to apply the concepts to IxSet so that you can store the keys in RAM, the the values on disk. Haven&#039;t looked at that in detail yet though.

thanks!
- jeremy</description>
		<content:encoded><![CDATA[<p>Great stuff! These concepts are being used in the latest version of sendfile and happstack now.</p>
<p>You can see my write-up on how it is used in sendfile here,</p>
<p><a href="http://happstack.blogspot.com/2010/07/sendfile-071.html" rel="nofollow">http://happstack.blogspot.com/2010/07/sendfile-071.html</a></p>
<p>I would love to hear what you have to say about it. </p>
<p>For sendfile, the library provides a &#8216;recursive&#8217; function, but the user needs to be able to do some stuff between each recursion. The user of sendfile library cares about controlling when the function is resumed, and working with the intermediate values. But it does not want to know about the internals of the sendfile function or what data needs to be propogated from one call to the next. The Iter provides a great way of doing this. (And allows us to hide the fact that the data which needs to be propogated is platform dependent).</p>
<p>In happstack, it used so that users can provide functions which process the contents of multipart/form-data and impose quotas, and decide if a value should be stored in RAM or saved on the disk. And, it needs to be able to do it in &#8216;constant&#8217; space. I have not documented this feature in detail yet but you can see the code here:</p>
<p><a href="http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-server/src/Happstack/Server/HTTP/Multipart.hs" rel="nofollow">http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-server/src/Happstack/Server/HTTP/Multipart.hs</a></p>
<p>Search for InputIter.</p>
<p>In this case, the user provides the function that does the work, but the happstack library needs to do things in-between recursions.  But the &#8216;private&#8217; data which needs to be passed each recursion can be different for different functions. Once again the Iter allows those differences to be wrapped up and hidden. But this time it is so that the library code can avoid having to know the inner details and can work with them in a generic manner.</p>
<p>I still hope to apply the concepts to IxSet so that you can store the keys in RAM, the the values on disk. Haven&#8217;t looked at that in detail yet though.</p>
<p>thanks!<br />
- jeremy</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on On powersets and folds by Linktipps Mai 2010 :: Blackflash</title>
		<link>http://blog.melding-monads.com/2010/04/04/on-powersets-and-folds/#comment-71</link>
		<dc:creator>Linktipps Mai 2010 :: Blackflash</dc:creator>
		<pubDate>Mon, 05 Apr 2010 20:59:07 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=153#comment-71</guid>
		<description>[...]  On powersets and folds: Wer gerne cleveren Haskell-Code liest, der ist bei diesem Artikel gut aufgehoben. [...]</description>
		<content:encoded><![CDATA[<p>[...]  On powersets and folds: Wer gerne cleveren Haskell-Code liest, der ist bei diesem Artikel gut aufgehoben. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Writer Monads via Continuations by lpsmith</title>
		<link>http://blog.melding-monads.com/2010/03/14/writer-monads-via-continuations/#comment-70</link>
		<dc:creator>lpsmith</dc:creator>
		<pubDate>Tue, 16 Mar 2010 01:00:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=211#comment-70</guid>
		<description>Also,  I should say that the continuation-based writer monad is one of the key aspects of all the various corecursive queue monads in my paper.   If you are comfortable with this post,  then it should be a little bit easier to understand the construction in my paper.

To clarify,  the continuation-based writer is used internally as part of the corecursive queue transformer,  but it cannot be used as an &lt;i&gt;argument&lt;/i&gt; to the transformer.</description>
		<content:encoded><![CDATA[<p>Also,  I should say that the continuation-based writer monad is one of the key aspects of all the various corecursive queue monads in my paper.   If you are comfortable with this post,  then it should be a little bit easier to understand the construction in my paper.</p>
<p>To clarify,  the continuation-based writer is used internally as part of the corecursive queue transformer,  but it cannot be used as an <i>argument</i> to the transformer.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Writer Monads via Continuations by lpsmith</title>
		<link>http://blog.melding-monads.com/2010/03/14/writer-monads-via-continuations/#comment-69</link>
		<dc:creator>lpsmith</dc:creator>
		<pubDate>Tue, 16 Mar 2010 00:44:11 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=211#comment-69</guid>
		<description>Yes.  The continuation monad lacks an &lt;code&gt;MonadFix&lt;/code&gt; instance,  which is why you can&#039;t use it with the corecursive queue transformer.  ;-)   Additionally, you can&#039;t use it with the examples in &lt;a href=&quot;http://blog.melding-monads.com/2009/12/30/fun-with-the-lazy-state-monad/&quot; rel=&quot;nofollow&quot;&gt;Fun with the Lazy State Monad&lt;/a&gt; for a different reason:  the continuation monad &lt;a href=&quot;http://blog.melding-monads.com/2009/12/20/are-continuations-really-the-mother-of-all-monads/&quot; rel=&quot;nofollow&quot;&gt;transmutes the lazy state monad into a strict state monad&lt;/a&gt;.

It is believed to be impossible to define &lt;code&gt;MonadFix&lt;/code&gt; on the standard continuation monad,  but as far as I am aware,  this is not definitively known.    Levent Erkök wrote about this conjecture in his Ph.D. thesis &lt;a href=&quot;http://sites.google.com/site/leventerkok/erkok-thesis.pdf?attredirects=0&quot; rel=&quot;nofollow&quot;&gt;Value Recursion in Monadic Computations&lt;/a&gt;, where he proves a theorem that seems to support the conjecture.  

However, we now know that the statement of Erkök&#039;s conjecture needs to be made more precise.  For example, the codensity monad is a continuation monad that uses higher-ranked types to hide the type of the result.   It appears in Edward Kmett&#039;s &lt;a href=&quot;http://hackage.haskell.org/package/category-extras&quot; rel=&quot;nofollow&quot;&gt;category-extras&lt;/a&gt; and Mauro Jaskelioff&#039;s &lt;a href=&quot;http://www.fceia.unr.edu.ar/~mauro/monatron/&quot; rel=&quot;nofollow&quot;&gt;Monatron&lt;/a&gt; library,  and is the key to Janis Voigtländer&#039;s paper.  Interestingly,  the codensity monad admits an instance for &lt;code&gt;MonadFix&lt;/code&gt;,  as demonstrated by Monatron but not category-extras.    However, the codensity&#039;s &lt;code&gt;MonadFix&lt;/code&gt; does not appear to be well-behaved,  as I don&#039;t know of any interesting examples where it converges.

Also,  I&#039;ve heard Erkök&#039;s conjecture informally stated as &quot;there are no useful fixpoint operators on continuations&quot;,  which my paper &quot;&lt;a href=&quot;http://themonadreader.wordpress.com/2009/07/29/issue-14/&quot; rel=&quot;nofollow&quot;&gt;Lloyd Allison&#039;s Corecursive Queues&lt;/a&gt;&quot; throughly refutes.    Not only did I demonstrate a fixpoint operator on the continuation monad,  I also demonstrate a practical application where it&#039;s use seems to be required!

If you are really interested in the studying the relationship of &lt;code&gt;MonadFix&lt;/code&gt;,  the continuation monad,  and other continuation-like monads,  you should probably take a look at &quot;&lt;a href=&quot;http://www.cs.indiana.edu/cgi-bin/techreports/TRNNN.cgi?trnum=TR546&quot; rel=&quot;nofollow&quot;&gt;Recursion is a Computational Effect&lt;/a&gt;&quot; by Dan Friedman and Amr Sabry.  I don&#039;t understand all the details,  but they implement &lt;code&gt;mfix&lt;/code&gt; on the continuation monad using &lt;code&gt;unsafePerformIO&lt;/code&gt;,  and use it to  implement &quot;&lt;a href=&quot;http://groups.google.com/group/comp.lang.scheme/msg/063a514aa6933180&quot; rel=&quot;nofollow&quot;&gt;LETREC + CALL/CC = SET!&lt;/a&gt;&quot; in Haskell.

It seems likely that there is something here yet to be discovered.  At the very least,  there are explanations to be made and things to be definitively confirmed or refuted.</description>
		<content:encoded><![CDATA[<p>Yes.  The continuation monad lacks an <code>MonadFix</code> instance,  which is why you can&#8217;t use it with the corecursive queue transformer.  ;-)   Additionally, you can&#8217;t use it with the examples in <a href="http://blog.melding-monads.com/2009/12/30/fun-with-the-lazy-state-monad/" rel="nofollow">Fun with the Lazy State Monad</a> for a different reason:  the continuation monad <a href="http://blog.melding-monads.com/2009/12/20/are-continuations-really-the-mother-of-all-monads/" rel="nofollow">transmutes the lazy state monad into a strict state monad</a>.</p>
<p>It is believed to be impossible to define <code>MonadFix</code> on the standard continuation monad,  but as far as I am aware,  this is not definitively known.    Levent Erkök wrote about this conjecture in his Ph.D. thesis <a href="http://sites.google.com/site/leventerkok/erkok-thesis.pdf?attredirects=0" rel="nofollow">Value Recursion in Monadic Computations</a>, where he proves a theorem that seems to support the conjecture.  </p>
<p>However, we now know that the statement of Erkök&#8217;s conjecture needs to be made more precise.  For example, the codensity monad is a continuation monad that uses higher-ranked types to hide the type of the result.   It appears in Edward Kmett&#8217;s <a href="http://hackage.haskell.org/package/category-extras" rel="nofollow">category-extras</a> and Mauro Jaskelioff&#8217;s <a href="http://www.fceia.unr.edu.ar/~mauro/monatron/" rel="nofollow">Monatron</a> library,  and is the key to Janis Voigtländer&#8217;s paper.  Interestingly,  the codensity monad admits an instance for <code>MonadFix</code>,  as demonstrated by Monatron but not category-extras.    However, the codensity&#8217;s <code>MonadFix</code> does not appear to be well-behaved,  as I don&#8217;t know of any interesting examples where it converges.</p>
<p>Also,  I&#8217;ve heard Erkök&#8217;s conjecture informally stated as &#8220;there are no useful fixpoint operators on continuations&#8221;,  which my paper &#8220;<a href="http://themonadreader.wordpress.com/2009/07/29/issue-14/" rel="nofollow">Lloyd Allison&#8217;s Corecursive Queues</a>&#8221; throughly refutes.    Not only did I demonstrate a fixpoint operator on the continuation monad,  I also demonstrate a practical application where it&#8217;s use seems to be required!</p>
<p>If you are really interested in the studying the relationship of <code>MonadFix</code>,  the continuation monad,  and other continuation-like monads,  you should probably take a look at &#8220;<a href="http://www.cs.indiana.edu/cgi-bin/techreports/TRNNN.cgi?trnum=TR546" rel="nofollow">Recursion is a Computational Effect</a>&#8221; by Dan Friedman and Amr Sabry.  I don&#8217;t understand all the details,  but they implement <code>mfix</code> on the continuation monad using <code>unsafePerformIO</code>,  and use it to  implement &#8220;<a href="http://groups.google.com/group/comp.lang.scheme/msg/063a514aa6933180" rel="nofollow">LETREC + CALL/CC = SET!</a>&#8221; in Haskell.</p>
<p>It seems likely that there is something here yet to be discovered.  At the very least,  there are explanations to be made and things to be definitively confirmed or refuted.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Writer Monads via Continuations by Job</title>
		<link>http://blog.melding-monads.com/2010/03/14/writer-monads-via-continuations/#comment-68</link>
		<dc:creator>Job</dc:creator>
		<pubDate>Mon, 15 Mar 2010 12:36:37 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=211#comment-68</guid>
		<description>Another disadvantage of continuation-based monads is that you can&#039;t make them instances of MonadFix :(</description>
		<content:encoded><![CDATA[<p>Another disadvantage of continuation-based monads is that you can&#8217;t make them instances of MonadFix :(</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Fun with the Lazy State Monad by lpsmith</title>
		<link>http://blog.melding-monads.com/2009/12/30/fun-with-the-lazy-state-monad/#comment-67</link>
		<dc:creator>lpsmith</dc:creator>
		<pubDate>Sat, 20 Feb 2010 04:12:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=154#comment-67</guid>
		<description>The problem is that once you apply a continuation transformer to the monad stack itself,  you make the lazy state monad a strict state monad,   and this algorithm will get stuck in an infinite non-productive loop.    It does not matter if it&#039;s a codensity transformer,  or a regular continuation transformer.  The higher-ranked types do not change the termination properties of the program.

One can verify my claim above by installing Edward Kmett&#039;s &lt;a href=&quot;http://hackage.haskell.org/package/category-extras&quot; rel=&quot;nofollow&quot;&gt;category-extras&lt;/a&gt; package,  and applying his Codensity transformer to the original code.    Also,  I think I see what you tried to do with &lt;code&gt;freshCod&lt;/code&gt;,  however,  your code produces a depth-first renumbering,  not breadth-first as is desired.

It&#039;s an interesting idea though;  is it possible to somehow &quot;layer&quot; the monads on each other without resorting to transformers?   Basically,  instead of combining the effects of two monads,  can you use one monad to structure the computation inside another monadic language while keeping them more-or-less separate?</description>
		<content:encoded><![CDATA[<p>The problem is that once you apply a continuation transformer to the monad stack itself,  you make the lazy state monad a strict state monad,   and this algorithm will get stuck in an infinite non-productive loop.    It does not matter if it&#8217;s a codensity transformer,  or a regular continuation transformer.  The higher-ranked types do not change the termination properties of the program.</p>
<p>One can verify my claim above by installing Edward Kmett&#8217;s <a href="http://hackage.haskell.org/package/category-extras" rel="nofollow">category-extras</a> package,  and applying his Codensity transformer to the original code.    Also,  I think I see what you tried to do with <code>freshCod</code>,  however,  your code produces a depth-first renumbering,  not breadth-first as is desired.</p>
<p>It&#8217;s an interesting idea though;  is it possible to somehow &#8220;layer&#8221; the monads on each other without resorting to transformers?   Basically,  instead of combining the effects of two monads,  can you use one monad to structure the computation inside another monadic language while keeping them more-or-less separate?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Fun with the Lazy State Monad by zygoloid</title>
		<link>http://blog.melding-monads.com/2009/12/30/fun-with-the-lazy-state-monad/#comment-66</link>
		<dc:creator>zygoloid</dc:creator>
		<pubDate>Sat, 20 Feb 2010 00:46:21 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=154#comment-66</guid>
		<description>Looks like you&#039;re secretly working in the Codensity Fresh monad (which is almost the same as ContT Fresh):

&lt;pre&gt;
type FreshCod n = Codensity (Fresh n)

runFreshCod :: Num n =&gt; FreshCod n a -&gt; a
runFreshCod m = runFresh (runCodensity m return)

freshCod :: Num n =&gt; FreshCod n n
freshCod = Codensity fresh

lazyRenum :: Num n =&gt; Tree a b -&gt; Tree n n
lazyRenum = runFreshCod . renumber
   where
     renumber (Leaf    _    )
        = do n &lt;- freshCod
             return (Leaf n)
     renumber (Branch  _ l r)
        = do n &lt;- freshCod
             l&#039; &lt;- renumber l
             r&#039; &lt;- renumber r
             return (Branch n l&#039; r&#039;)
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>Looks like you&#8217;re secretly working in the Codensity Fresh monad (which is almost the same as ContT Fresh):</p>
<pre>
type FreshCod n = Codensity (Fresh n)

runFreshCod :: Num n =&gt; FreshCod n a -&gt; a
runFreshCod m = runFresh (runCodensity m return)

freshCod :: Num n =&gt; FreshCod n n
freshCod = Codensity fresh

lazyRenum :: Num n =&gt; Tree a b -&gt; Tree n n
lazyRenum = runFreshCod . renumber
   where
     renumber (Leaf    _    )
        = do n &lt;- freshCod
             return (Leaf n)
     renumber (Branch  _ l r)
        = do n &lt;- freshCod
             l&#39; &lt;- renumber l
             r&#39; &lt;- renumber r
             return (Branch n l&#39; r&#39;)
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Are continuations really the mother of all monads? by lpsmith</title>
		<link>http://blog.melding-monads.com/2009/12/20/are-continuations-really-the-mother-of-all-monads/#comment-65</link>
		<dc:creator>lpsmith</dc:creator>
		<pubDate>Sat, 06 Feb 2010 21:47:20 +0000</pubDate>
		<guid isPermaLink="false">http://blog.melding-monads.com/?p=132#comment-65</guid>
		<description>It was pointed out to me by Russell O&#039;Connor, Dan Doel, and others that &lt;code&gt;StateT st (Cont r)&lt;/code&gt; is in fact the exact same monad as &lt;code&gt;ContT r (State st)&lt;/code&gt; in the context of the Monad Transformer Library.   However, &lt;a href=&quot;http://www.fceia.unr.edu.ar/~mauro/&quot; rel=&quot;nofollow&quot;&gt;Mauro Jaskelioff&lt;/a&gt; in his paper &lt;a href=&quot;http://www.fceia.unr.edu.ar/~mauro/pubs/mmt/mmt.pdf&quot; rel=&quot;nofollow&quot;&gt;Modular Monad Transformers&lt;/a&gt;  argues in Section 4 that it is more natural for &lt;code&gt;callCC&lt;/code&gt; to be lifted differently in the &lt;code&gt;StateT st (Cont r)&lt;/code&gt; case,  so that it differs from the instance of &lt;code&gt;callCC&lt;/code&gt; for &lt;code&gt;ContT r (State st)&lt;/code&gt;.    According to Jaskelioff,  the MTL&#039;s lifting is correct in the second case,  but not in the first.

The two liftings are also mentioned in Monad Transformers and Modular Interpreters in Section 8.3,  which includes a few other references to where each has appeared in the literature.</description>
		<content:encoded><![CDATA[<p>It was pointed out to me by Russell O&#8217;Connor, Dan Doel, and others that <code>StateT st (Cont r)</code> is in fact the exact same monad as <code>ContT r (State st)</code> in the context of the Monad Transformer Library.   However, <a href="http://www.fceia.unr.edu.ar/~mauro/" rel="nofollow">Mauro Jaskelioff</a> in his paper <a href="http://www.fceia.unr.edu.ar/~mauro/pubs/mmt/mmt.pdf" rel="nofollow">Modular Monad Transformers</a>  argues in Section 4 that it is more natural for <code>callCC</code> to be lifted differently in the <code>StateT st (Cont r)</code> case,  so that it differs from the instance of <code>callCC</code> for <code>ContT r (State st)</code>.    According to Jaskelioff,  the MTL&#8217;s lifting is correct in the second case,  but not in the first.</p>
<p>The two liftings are also mentioned in Monad Transformers and Modular Interpreters in Section 8.3,  which includes a few other references to where each has appeared in the literature.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
