<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://lorgonblog.spaces.live.com/mmm2008-05-17_13.22/rsspretty.aspx?rssquery=en-US;http%3a%2f%2florgonblog.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Inside F#</title><description>Brian's random thoughts about writing code for .NET</description><link>http://lorgonblog.spaces.live.com/</link><language>en-US</language><pubDate>Sun, 06 Jul 2008 17:41:49 GMT</pubDate><lastBuildDate>Sun, 06 Jul 2008 17:41:49 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>8076776766069723920</live:id><live:alias>lorgonblog</live:alias></live:identity><image><title>Inside F#</title><url>http://byfiles.storage.live.com/y1pggh9jTfXwklqMxpdySmG2qrOxKPul-DkyqSUmh5zBN7P7xQe1imp6ynCSvfOS2z0</url><link>http://lorgonblog.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Catamorphisms, part eight</title><link>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!263.entry</link><description>&lt;p&gt;In the interest of completeness, I have to point out one thing I left out of the &lt;a href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry"&gt;previous blog entry in the series&lt;/a&gt;.  Some of you may have wondered why I used the continuation monad in &amp;quot;Change5to0bst&amp;quot;, but not in the definition of KFoldTree.  If you try writing KFoldTree as &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldTree nodeF leafV tree = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t = K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; t &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,left,right&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:blue"&gt;return!&lt;/span&gt; nodeF x &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop right&lt;span style="color:blue"&gt;)&lt;/span&gt; t &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:blue"&gt;return!&lt;/span&gt; leafV t  &lt;br&gt;    &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;br&gt;    Loop tree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;(with the rest of the code unchanged since the previous blog entry,) you'll discover you once again get a stack overflow.  Ack!  The good news is, this is just because I originally defined the monad slightly wrong.  The fix is simple; here is the corrected definition: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; ContinuationBuilder&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Return&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Let&lt;span style="color:blue"&gt;(&lt;/span&gt;x,f&lt;span style="color:blue"&gt;)&lt;/span&gt; = f x &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Bind&lt;span style="color:blue"&gt;(&lt;/span&gt;m,f&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; m &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; a &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; f a k&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Delay&lt;span style="color:blue"&gt;(&lt;/span&gt;f&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; f &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; k&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; K = &lt;span style="color:blue"&gt;new&lt;/span&gt; ContinuationBuilder&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;The only difference is the definition of Delay, which has undergone &lt;a href="http://en.wikipedia.org/wiki/Eta_expansion#.CE.B7-conversion"&gt;eta-conversion&lt;/a&gt;.  With the corrected definition of &amp;quot;K&amp;quot;, the above code for KFoldTree works correctly.  I am posting this just for completeness and posterity, so no deep explanations or new material today.   &lt;p&gt;The end!&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8076776766069723920&amp;page=RSS%3a+Catamorphisms%2c+part+eight&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lorgonblog.spaces.live.com&amp;amp;GT1=lorgonblog"&gt;</description><comments>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!263.entry#comment</comments><guid isPermaLink="true">http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!263.entry</guid><pubDate>Tue, 17 Jun 2008 05:32:06 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!263/comments/feed.rss</wfw:commentRss><wfw:comment>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!263.entry#comment</wfw:comment><dcterms:modified>2008-06-17T05:32:06Z</dcterms:modified></item><item><title>"Game of Life" Challenge</title><link>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!261.entry</link><description>&lt;p&gt;I was browsing the web looking for fun small programming tasks, and I stumbled across &lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt;Conway's Game of Life&lt;/a&gt;.  This is an oldie but a goodie; I am continually fascinated by how such a simple set of rules and starting conditions leads to such complex behavior. &lt;p&gt;Coding up the game logic is simple; however I know so little about graphics/presentation that I struggled to make a minimal display.  The first thing I got working was displaying a different bitmap image each frame, yielding results that look like this: &lt;p&gt;&lt;a href="http://ec8eza.bay.livefilestore.com/y1p7lAbusTT0ZwjxOSTBm525VzE91tWhWgIw-jhE66VgLfUQ6w5_NIdZmtLm9i5XECkljA4J29H5CkUdDMofeBUfQ?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=484 alt=GameOfLife src="http://ec8eza.bay.livefilestore.com/y1pyrlABIE14_pW3awl6wpyVwDWtPe4qxN7BeDb0LfmQMbmtxIPFowJ8FzqyZkswzXmGCdC7qeYDLIyPtqA1OTFnd3GOwJX3P2k?PARTNER=WRITER" width=608 border=0&gt;&lt;/a&gt;  &lt;p&gt;While good enough to watch, I would love to make it prettier (show the number of generations, perhaps use color to suggest the age of cells, use circles or gridlines or something that makes the image itself look nicer) and have interaction (slider bar to control speed, ability to pause and interact to add/remove cells, change size/zoom of overall grid), as well as be better engineered (the code I wrote does both the animation and the display very crudely), but I lack the WPF skills, the time, or both. &lt;p&gt;...Hence the &amp;quot;challenge&amp;quot; in the blog title today.  Show me your skills!  I would like to see what others can do with F#.  Extra points for good eye candy, cool user interaction, and demonstration of advanced WPF features.  You can put a link to your submission as a 'comment' on this blog entry.  Have fun! &lt;h5&gt;The source code&lt;/h5&gt; &lt;p&gt;Here's the code I have: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;#light&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;#I&lt;/span&gt; &lt;span style="color:maroon"&gt;@&amp;quot;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0&amp;quot;&lt;/span&gt;  &lt;br&gt;&lt;span style="color:blue"&gt;#r&lt;/span&gt; &lt;span style="color:maroon"&gt;@&amp;quot;WindowsBase.dll&amp;quot;&lt;/span&gt;  &lt;br&gt;&lt;span style="color:blue"&gt;#r&lt;/span&gt; &lt;span style="color:maroon"&gt;@&amp;quot;PresentationCore.dll&amp;quot;&lt;/span&gt;  &lt;br&gt;&lt;span style="color:blue"&gt;#r&lt;/span&gt; &lt;span style="color:maroon"&gt;@&amp;quot;PresentationFramework.dll&amp;quot;&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System &lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System&lt;span style="color:blue"&gt;.&lt;/span&gt;Windows  &lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System&lt;span style="color:blue"&gt;.&lt;/span&gt;Windows&lt;span style="color:blue"&gt;.&lt;/span&gt;Controls  &lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System&lt;span style="color:blue"&gt;.&lt;/span&gt;Windows&lt;span style="color:blue"&gt;.&lt;/span&gt;Media  &lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System&lt;span style="color:blue"&gt;.&lt;/span&gt;Windows&lt;span style="color:blue"&gt;.&lt;/span&gt;Media&lt;span style="color:blue"&gt;.&lt;/span&gt;Imaging &lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System&lt;span style="color:blue"&gt;.&lt;/span&gt;Threading &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; MAXX = &lt;span style="color:maroon"&gt;80&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; MAXY = &lt;span style="color:maroon"&gt;60&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; SCALE = &lt;span style="color:maroon"&gt;8&lt;/span&gt;   &lt;span style="color:green"&gt;// size of block in pixels - this must be 8 (for simplicity of coding bitmap)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// game board is just 2D array of bools&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;mutable&lt;/span&gt; cells = Array2&lt;span style="color:blue"&gt;.&lt;/span&gt;create MAXX MAXY &lt;span style="color:blue"&gt;false&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; NumNeighbors&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|&lt;/span&gt;&lt;span style="color:blue"&gt;|&lt;/span&gt; x &amp;gt;= MAXX &lt;span style="color:blue"&gt;|&lt;/span&gt;&lt;span style="color:blue"&gt;|&lt;/span&gt; y &amp;lt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|&lt;/span&gt;&lt;span style="color:blue"&gt;|&lt;/span&gt; y &amp;gt;= MAXY &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;false&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            cells&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;x,y&lt;span style="color:blue"&gt;]&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;mutable&lt;/span&gt; r = &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x-&lt;span style="color:maroon"&gt;1&lt;/span&gt;,y-&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x-&lt;span style="color:maroon"&gt;1&lt;/span&gt;,y&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x-&lt;span style="color:maroon"&gt;1&lt;/span&gt;,y+&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y-&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y+&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x+&lt;span style="color:maroon"&gt;1&lt;/span&gt;,y-&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x+&lt;span style="color:maroon"&gt;1&lt;/span&gt;,y&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; At&lt;span style="color:blue"&gt;(&lt;/span&gt;x+&lt;span style="color:maroon"&gt;1&lt;/span&gt;,y+&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; r &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; r + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;    r &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// compute next board&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Tick&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; nextCells = Array2&lt;span style="color:blue"&gt;.&lt;/span&gt;init MAXX MAXY &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x y &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; cells&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;x,y&lt;span style="color:blue"&gt;]&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;match&lt;/span&gt; NumNeighbors&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;|&lt;/span&gt; &lt;span style="color:maroon"&gt;2&lt;/span&gt; &lt;span style="color:blue"&gt;|&lt;/span&gt; &lt;span style="color:maroon"&gt;3&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:blue"&gt;true&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;|&lt;/span&gt; _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:blue"&gt;false&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            NumNeighbors&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:maroon"&gt;3&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    cells &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; nextCells &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// use a small grid of 1s and 0s to initialize the whole grid;&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// put initial contents in the center of the large grid&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Init&lt;span style="color:blue"&gt;(&lt;/span&gt;seed&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; seedHeight = Array&lt;span style="color:blue"&gt;.&lt;/span&gt;length seed &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; seedWidth = Array&lt;span style="color:blue"&gt;.&lt;/span&gt;length seed&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;&lt;span style="color:blue"&gt;]&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; starty = &lt;span style="color:blue"&gt;(&lt;/span&gt;MAXY - seedHeight&lt;span style="color:blue"&gt;)&lt;/span&gt; / &lt;span style="color:maroon"&gt;2&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; startx = &lt;span style="color:blue"&gt;(&lt;/span&gt;MAXX - seedWidth&lt;span style="color:blue"&gt;)&lt;/span&gt; / &lt;span style="color:maroon"&gt;2&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;for&lt;/span&gt; x &lt;span style="color:blue"&gt;in&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;seedWidth-&lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;span style="color:blue"&gt;do&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;for&lt;/span&gt; y &lt;span style="color:blue"&gt;in&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;seedHeight-&lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;span style="color:blue"&gt;do&lt;/span&gt; &lt;br&gt;            cells&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;startx+x,starty+y&lt;span style="color:blue"&gt;]&lt;/span&gt; &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; seed&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;y&lt;span style="color:blue"&gt;]&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;x&lt;span style="color:blue"&gt;]&lt;/span&gt; = &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// some sample starters&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; glider = &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt;  &lt;br&gt;                &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;                &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;             &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; diehard = &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt;  &lt;br&gt;                 &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;                 &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; fPentomino = &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt;  &lt;br&gt;                    &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;                    &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;                 &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; acorn = &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt;  &lt;br&gt;               &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;               &lt;span style="color:blue"&gt;[|&lt;/span&gt; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;0&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt;; &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;|]&lt;/span&gt; &lt;br&gt;              &lt;br&gt;Init&lt;span style="color:blue"&gt;(&lt;/span&gt;acorn&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; MyWPFWindow&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;as&lt;/span&gt; this =  &lt;br&gt;    &lt;span style="color:blue"&gt;inherit&lt;/span&gt; Window&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;as&lt;/span&gt; base    &lt;br&gt;&lt;br&gt;    &lt;span style="color:green"&gt;// make a bitmap of the data&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; GetByte bn = &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; n = bn * &lt;span style="color:maroon"&gt;8&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; y = n / &lt;span style="color:blue"&gt;(&lt;/span&gt;MAXX*SCALE*SCALE&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; xs = n % &lt;span style="color:blue"&gt;(&lt;/span&gt;MAXX*SCALE*SCALE&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; x = &lt;span style="color:blue"&gt;(&lt;/span&gt;xs % &lt;span style="color:blue"&gt;(&lt;/span&gt;MAXX*SCALE&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;/SCALE &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; not&lt;span style="color:blue"&gt;(&lt;/span&gt;cells&lt;span style="color:blue"&gt;.&lt;/span&gt;&lt;span style="color:blue"&gt;[&lt;/span&gt;x,y&lt;span style="color:blue"&gt;]&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;byte&lt;/span&gt; &lt;span style="color:maroon"&gt;255&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;byte&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; MakeBitmapSource&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; bytes = Array&lt;span style="color:blue"&gt;.&lt;/span&gt;init &lt;span style="color:blue"&gt;(&lt;/span&gt;SCALE*MAXX*MAXY&lt;span style="color:blue"&gt;)&lt;/span&gt; GetByte &lt;br&gt;        BitmapSource&lt;span style="color:blue"&gt;.&lt;/span&gt;Create&lt;span style="color:blue"&gt;(&lt;/span&gt;SCALE*MAXX, SCALE*MAXY, &lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;, &lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;.&lt;/span&gt;, PixelFormats&lt;span style="color:blue"&gt;.&lt;/span&gt;BlackWhite,  &lt;br&gt;                            BitmapPalettes&lt;span style="color:blue"&gt;.&lt;/span&gt;BlackAndWhite, bytes, MAXX&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:green"&gt;// display code    &lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; image = &lt;span style="color:blue"&gt;new&lt;/span&gt; Image&lt;span style="color:blue"&gt;(&lt;/span&gt;Width=&lt;span style="color:blue"&gt;float&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;SCALE*MAXX&lt;span style="color:blue"&gt;)&lt;/span&gt;, Height=&lt;span style="color:blue"&gt;float&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;SCALE*MAXY&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;mutable&lt;/span&gt; iter = &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;do&lt;/span&gt; &lt;br&gt;        image&lt;span style="color:blue"&gt;.&lt;/span&gt;Source &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; MakeBitmapSource&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        CompositionTarget&lt;span style="color:blue"&gt;.&lt;/span&gt;add_Rendering&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; o e &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:green"&gt;// prevent loss of first frame&lt;/span&gt; &lt;br&gt;                                                   &lt;span style="color:blue"&gt;if&lt;/span&gt; iter &amp;lt; &lt;span style="color:maroon"&gt;2&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;                                                       iter &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; iter + &lt;span style="color:maroon"&gt;1&lt;/span&gt; &lt;br&gt;                                                   &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;                                                       Tick&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;                                                       image&lt;span style="color:blue"&gt;.&lt;/span&gt;Source &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; MakeBitmapSource&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;                                                       Thread&lt;span style="color:blue"&gt;.&lt;/span&gt;Sleep&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;200&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        this&lt;span style="color:blue"&gt;.&lt;/span&gt;Content &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; image &lt;br&gt;        this&lt;span style="color:blue"&gt;.&lt;/span&gt;Title &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:maroon"&gt;&amp;quot;Game of Life&amp;quot;&lt;/span&gt;  &lt;br&gt;        this&lt;span style="color:blue"&gt;.&lt;/span&gt;SizeToContent &lt;span style="color:blue"&gt;&amp;lt;-&lt;/span&gt; SizeToContent&lt;span style="color:blue"&gt;.&lt;/span&gt;WidthAndHeight   &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;[&amp;lt;&lt;/span&gt;STAThread&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;]&lt;/span&gt;  &lt;br&gt;&lt;span style="color:blue"&gt;do&lt;/span&gt;   &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; app =  &lt;span style="color:blue"&gt;new&lt;/span&gt; Application&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;    app&lt;span style="color:blue"&gt;.&lt;/span&gt;Run&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;new&lt;/span&gt; MyWPFWindow&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;|&lt;/span&gt;&amp;gt; ignore &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8076776766069723920&amp;page=RSS%3a+%22Game+of+Life%22+Challenge&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lorgonblog.spaces.live.com&amp;amp;GT1=lorgonblog"&gt;</description><comments>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!261.entry#comment</comments><guid isPermaLink="true">http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!261.entry</guid><pubDate>Sun, 15 Jun 2008 16:52:24 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!261/comments/feed.rss</wfw:commentRss><wfw:comment>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!261.entry#comment</wfw:comment><dcterms:modified>2008-06-15T16:52:24Z</dcterms:modified></item><item><title>Catamorphisms, part seven</title><link>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!256.entry</link><description>&lt;p&gt;The code in the &lt;a href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!251.entry"&gt;previous blog entry&lt;/a&gt; was difficult to read due to the use of explicit continuations.  Today I'll show how to make the code more readable using a continuation monad.  I'll also discuss F# &amp;quot;computation expressions&amp;quot; (a.k.a. &amp;quot;workflows&amp;quot;) in a little more depth. &lt;p&gt;(Today's blog entry is probably the most &amp;quot;advanced&amp;quot; that I've written, as it deals with three advanced functional programming concepts (catamorphisms, continuations, and monads) simultaneously.  I'll try to revert back to some beginner/intermediate F# topics (that may attract a wider audience) in future blog entries... but today I am just writing about things that tickle my fancy.) &lt;h5&gt;The trouble with continuations&lt;/h5&gt; &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Continuations#Programming_language_support"&gt;Continuations&lt;/a&gt; are an almost indispensable mechanism for achieving certain goals.  For example, in the previous entry I showed how to use KFold to process arbitrary tree-like data structures without using the call stack.  This is a win when you need to process large, arbitrarily-shaped (e.g. unbalanced trees) data.  However the resulting code suffered a bit in terms of readability.  Last time we ended up with code like &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bstExplicitContinuations tree =  &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newL &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k t&lt;span style="color:blue"&gt;)&lt;/span&gt; tree&lt;/div&gt; &lt;p&gt;for changing one value to another in a binary search tree.  The weird bits now are that our lambdas take an extra &amp;quot;k&amp;quot; parameter at the end of the parameter list, and we write code using the &amp;quot;k&amp;quot; variables rather awkwardly.  Compare the code above to a simple, non-tail-recursive implementation of the same method which doesn't use a fold: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Change5to0bstUsingStack tree = &lt;br&gt;    &lt;span style="color:blue"&gt;match&lt;/span&gt; tree &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt; newR = Change5to0bstUsingStack oldR &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt; newL = Change5to0bstUsingStack oldL &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;, oldL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; tree&lt;/div&gt; &lt;p&gt;The main difference I want to highlight is this &lt;div style="font-family:courier new"&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;/div&gt; &lt;p&gt;versus this &lt;div style="font-family:courier new"&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt; newR = Change5to0bstUsingStack oldR &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;The latter code looks much more familiar, whereas the former code that explicitly uses continuations looks kind of odd/backwards and uses weird lambdas and parens that are hard to read/parse at a glance. &lt;p&gt;It turns out that we can leverage &lt;a href="http://blogs.msdn.com/dsyme/archive/2007/09/22/some-details-on-f-computation-expressions-aka-monadic-or-workflow-syntax.aspx"&gt;F# computation expressions&lt;/a&gt; to get better syntax for the continuation-version of the code.  By coding up the continuation monad, we can use continuation workflows, so that that little code snippet becomes &lt;div style="font-family:courier new"&gt;            &lt;span style="color:blue"&gt;let!&lt;/span&gt; newR = kr                &lt;br&gt;            &lt;font color="#0000ff"&gt;return&lt;/font&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;In the long run, this is much more readable an understandable (especially if there are more than 2 lines of code) than the explicit continuations version.  But the &amp;quot;let!&amp;quot; and &amp;quot;return&amp;quot; keywords are pretty new to us (we saw them in passing in a &lt;a href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!208.entry"&gt;previous blog about async workflows&lt;/a&gt;), so let's pause and talk a little about F# computation expressions first. &lt;h5&gt;How to read F# computation expressions&lt;/h5&gt; &lt;p&gt;F# computation expressions are a syntax sugar for writing code where a portion of that code deals with a particular &lt;em&gt;monad&lt;/em&gt;.  (I'm continuing to defer the discussion of exactly what a monad is, but if you've been keeping up with previous blog entries I've written, you know that &lt;a href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!155.entry"&gt;parsers can be expressed as a monad&lt;/a&gt;, and &lt;a href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!208.entry"&gt;asynchronous computations can be expressed through monads&lt;/a&gt;, and today we'll see a monad of continuations.  Monads have many uses, but they are very abstract, and thus hard to explain without a lot of examples already under your belt.)  A computation expression takes this general form: &lt;div style="font-family:courier new"&gt;    foo &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;em&gt;comp_expr_code&lt;/em&gt; &lt;span style="color:blue"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;p&gt;where &amp;quot;foo&amp;quot; is a &amp;quot;builder&amp;quot; object for a particular monad, and then &lt;em&gt;comp_expr_code&lt;/em&gt; is code written using a special subset of F# that can be used inside computation expressions. &lt;p&gt;Consider this &amp;quot;normal&amp;quot; F# code: &lt;div style="font-family:courier new"&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; x = &lt;span style="color:maroon"&gt;3&lt;/span&gt; &lt;br&gt;    f&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; y = g&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    h&lt;span style="color:blue"&gt;(&lt;/span&gt;y&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    x + y&lt;/div&gt; &lt;p&gt;Assuming that all these functions and values have nothing to do with the &amp;quot;foo&amp;quot; monad, we can lift this code into a computation expression for foos thusly: &lt;div style="font-family:courier new"&gt;    foo &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; x = &lt;span style="color:maroon"&gt;3&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;do&lt;/span&gt; f&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; y = g&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;do&lt;/span&gt; h&lt;span style="color:blue"&gt;(&lt;/span&gt;y&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;font color="#0000ff"&gt;return&lt;/font&gt; x + y &lt;br&gt;    &lt;span style="color:blue"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;p&gt;When moving code into a computation expression, &amp;quot;let&amp;quot;s are unchanged, functions that are called just for effects are prefixed with &amp;quot;do&amp;quot;, and the final value is prefixed with the &amp;quot;return&amp;quot; keyword.  The result is code with pretty much the same meaning, except that the whole expression has been lifted into the &amp;quot;foo&amp;quot; monad, which may change its final value and type.  If in this example, &amp;quot;x&amp;quot; and &amp;quot;y&amp;quot; had type &amp;quot;int&amp;quot;, then the normal code results in an &amp;quot;int&amp;quot;, whereas the computation expression results in a value of type &amp;quot;Foo&amp;lt;int&amp;gt;&amp;quot; where &amp;quot;Foo&amp;quot; is some data type associated with the monad described by builder &amp;quot;foo&amp;quot;. &lt;p&gt;A concrete example will help - consider asynchronous computations.  In the example above, if &amp;quot;foo&amp;quot; is replaced with &amp;quot;async&amp;quot;, then the result of the whole expression is an &amp;quot;Async&amp;lt;int&amp;gt;&amp;quot; - an asynchronous computation that will eventually yield a value of type &amp;quot;int&amp;quot;.  Recall that &amp;quot;Async&amp;lt;'a&amp;gt;&amp;quot; is the data type that describes asynchronous computations, and &amp;quot;async&amp;quot; is the corresponding &amp;quot;builder&amp;quot; object for the asynchronous monad (&amp;quot;async&amp;quot; and &amp;quot;Async&amp;lt;'a&amp;gt;&amp;quot; are defined in the &lt;a href="http://research.microsoft.com/fsharp/manual/FSharp.Core/Microsoft.FSharp.Control.html"&gt;F# Control library&lt;/a&gt;). &lt;p&gt;In addition to &amp;quot;let&amp;quot;, &amp;quot;do&amp;quot; and &amp;quot;return&amp;quot;, which operate on &amp;quot;normal&amp;quot; values, there are corresponding keywords &amp;quot;let!&amp;quot;, &amp;quot;do!&amp;quot;, and &amp;quot;return!&amp;quot; which operate on monadic values.  In our previous example, &amp;quot;g&amp;quot; was a function that returned an &amp;quot;int&amp;quot;, and &amp;quot;h&amp;quot; was a function that returned &amp;quot;unit&amp;quot;.  Suppose, instead, that &amp;quot;g&amp;quot; returns a &amp;quot;Foo&amp;lt;int&amp;gt;&amp;quot; and &amp;quot;h&amp;quot; returns &amp;quot;Foo&amp;lt;unit&amp;gt;&amp;quot;.  In that case, we could write &lt;div style="font-family:courier new"&gt;   foo &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; x = &lt;span style="color:maroon"&gt;3&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;do&lt;/span&gt; f&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;let!&lt;/span&gt; y = g&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;do!&lt;/span&gt; h&lt;span style="color:blue"&gt;(&lt;/span&gt;y&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;font color="#0000ff"&gt;return&lt;/font&gt; x + y &lt;br&gt;    &lt;span style="color:blue"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;p&gt;where we have added the &amp;quot;!&amp;quot; (usually pronounced &amp;quot;bang&amp;quot;) to the lines using &amp;quot;g&amp;quot; and &amp;quot;h&amp;quot;.  The &amp;quot;!&amp;quot; says that the expression being processed is monadic, and should be processed according to the semantics given by the corresponding builder object.  The results of these monadic computations still have &amp;quot;normal&amp;quot; values - so for example, even though &amp;quot;g&amp;quot; returns a &amp;quot;Foo&amp;lt;int&amp;gt;&amp;quot;, the &amp;quot;let!&amp;quot; ensures that the type of &amp;quot;y&amp;quot; is simply &amp;quot;int&amp;quot;. &lt;p&gt;Again, a concrete example helps - consider again async computations.  Suppose &amp;quot;g&amp;quot; returns an Async&amp;lt;int&amp;gt;.  The &amp;quot;let!&amp;quot; says to run that async computation to completion until it yields an &amp;quot;int&amp;quot; value, and then bind that value to &amp;quot;y&amp;quot;.  Similarly, if &amp;quot;foo&amp;quot; were &amp;quot;async&amp;quot;, then &amp;quot;do!&amp;quot; would run its async computation to completion to produce an effect. &lt;p&gt;In short, inside a computation expression, you use &amp;quot;let&amp;quot;, &amp;quot;do&amp;quot;, and &amp;quot;return&amp;quot; for &amp;quot;normal&amp;quot; values, and you use &amp;quot;let!&amp;quot;, &amp;quot;do!&amp;quot;, and &amp;quot;return!&amp;quot; for values with a monadic type that need special processing specific to the particular monad we are in (as described by the builder object).  As with LINQ in C#, it's all just syntax sugar - the compiler desugars the code snippet above into &lt;div style="font-family:courier new"&gt;    foo&lt;span style="color:blue"&gt;.&lt;/span&gt;Delay&lt;span style="color:blue"&gt;(&lt;/span&gt;     &lt;span style="color:blue"&gt;fun&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;    foo&lt;span style="color:blue"&gt;.&lt;/span&gt;Let&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;3&lt;/span&gt;,     &lt;span style="color:blue"&gt;fun&lt;/span&gt; x  &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;    foo&lt;span style="color:blue"&gt;.&lt;/span&gt;Let&lt;span style="color:blue"&gt;(&lt;/span&gt;f&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;,   &lt;span style="color:blue"&gt;fun&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;    foo&lt;span style="color:blue"&gt;.&lt;/span&gt;Bind&lt;span style="color:blue"&gt;(&lt;/span&gt;g&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt;, &lt;span style="color:blue"&gt;fun&lt;/span&gt; y  &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;    foo&lt;span style="color:blue"&gt;.&lt;/span&gt;Bind&lt;span style="color:blue"&gt;(&lt;/span&gt;h&lt;span style="color:blue"&gt;(&lt;/span&gt;y&lt;span style="color:blue"&gt;)&lt;/span&gt;, &lt;span style="color:blue"&gt;fun&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;    foo&lt;span style="color:blue"&gt;.&lt;/span&gt;Return&lt;span style="color:blue"&gt;(&lt;/span&gt;x+y&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;Now, it just so happens that, given particular interesting definitions of &amp;quot;Delay&amp;quot;, &amp;quot;Let&amp;quot;, &amp;quot;Bind&amp;quot;, and &amp;quot;Return&amp;quot;, you can make that little code snippet have all kinds of interesting effects (like async, or parsing, or continuations, or ...) - that is the magic of monads.  But we're getting ahead of ourselves - for now, at least you have a cursory introduction to the F# computation expression syntax. &lt;h5&gt;Defining a continuation monad&lt;/h5&gt; &lt;p&gt;A continuation monad in F# can be defined like so: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; ContinuationBuilder&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Return&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Let&lt;span style="color:blue"&gt;(&lt;/span&gt;x,f&lt;span style="color:blue"&gt;)&lt;/span&gt; = f x &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Bind&lt;span style="color:blue"&gt;(&lt;/span&gt;m,f&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; m &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; a &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; f a k&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Delay&lt;span style="color:blue"&gt;(&lt;/span&gt;f&lt;span style="color:blue"&gt;)&lt;/span&gt; = f&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; K = &lt;span style="color:blue"&gt;new&lt;/span&gt; ContinuationBuilder&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;Unless you are trying to understand the mechanics of what is going on very deeply, you can pretty much just gloss over that definition - continuation monads are well-understood, and that's what it looks like to write one in F#.  Generally this is code that would be off in a library somewhere, but this code isn't in any of the standard F# libraries, so I'm writing it myself. &lt;p&gt;What is important is that, with this thing in hand, we can now write &amp;quot;continuation workflows&amp;quot;, which are just computation expressions that use the &amp;quot;K&amp;quot; builder object to produce values in the monad of continuations.  Let's see how to use it. &lt;h5&gt;Leveraging the continuation monad to make our code more readable&lt;/h5&gt; &lt;p&gt;Consider again our code that was traversing a binary search tree to replace values: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bstExplicitContinuations tree =  &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newL &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k t&lt;span style="color:blue"&gt;)&lt;/span&gt; tree&lt;/div&gt; &lt;p&gt;We can rewrite this code using the continuation monad thusly: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bst tree = &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt;! newR = kr                &lt;br&gt;            return Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt;! newL = kl &lt;br&gt;            return Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            return Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;}&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; return t &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; tree&lt;/div&gt; &lt;p&gt;Here are the changes relative to the previous version: &lt;ul&gt; &lt;li&gt;The final &amp;quot;k&amp;quot; parameter to each lambda has been eliminated.  Since the body of each lambda is now a continuation workflow (code of the form &amp;quot;K { ... }&amp;quot;), the result will be a monadic value of the general form &amp;quot;fun k -&amp;gt; ...&amp;quot;, and so extra &amp;quot;k&amp;quot; parameter is now implicitly handled by the monad. &lt;li&gt;The &amp;quot;continuation-ness&amp;quot; of the &amp;quot;kl&amp;quot; and &amp;quot;kr&amp;quot; parameters is gone.  Recall that these parameters represent recursive calls on the left and right subtrees, respectively.  Whereas previously we had to call them using continuation-style syntax &amp;quot;kr (fun newR -&amp;gt; ...&amp;quot;, now we call them with more natural syntax &amp;quot;let! newR = kr&amp;quot;.  We use the &amp;quot;!&amp;quot; form of &amp;quot;let&amp;quot; because &amp;quot;kr&amp;quot; is a value in the monad (&amp;quot;kr&amp;quot; is a continuation). &lt;li&gt;We don't have to call a continuation on the final result, we just need to &amp;quot;return&amp;quot; it.  We are returning Nodes, which are &amp;quot;normal&amp;quot; (non-monadic) values, so we use the non-&amp;quot;!&amp;quot; form (&amp;quot;return&amp;quot; rather than &amp;quot;return!&amp;quot;).  &lt;/ul&gt; &lt;p&gt;The types and behavior all work out just as in the original version - this code has the same semantics as the original version, it's just easier on the eyes (especially so once you are already familiar with the F# computation expression syntax). &lt;h5&gt;One more example&lt;/h5&gt; &lt;p&gt;Let's take a look at one more example of applying the continuation monad - using it on the &amp;quot;Eval&amp;quot; function, another running example in this blog series.  (Recall: that example has a data type called &amp;quot;Expr&amp;quot; to represent a tiny expression language, comprising integer constants, binary operators (Plus and Minus), if-then-else expressions, and &amp;quot;print&amp;quot; expressions.)  Here is the previous version of the &amp;quot;Eval&amp;quot; code, using explicit continuations (though slightly reformatted to make for easier comparison with the new version I'm about to show): &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; EvalExplicitContinuations expr =   &lt;br&gt;    KFoldExpr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k x&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kl op kr _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; l &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                   kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; r &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;match&lt;/span&gt; op &lt;span style="color:blue"&gt;with&lt;/span&gt;  &lt;br&gt;                                   &lt;span style="color:blue"&gt;|&lt;/span&gt; Plus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;l+r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;|&lt;/span&gt; Minus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;l-r&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kc kt ke _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; kc &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; c &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;if&lt;/span&gt; c &amp;lt;&amp;gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;                                       kt &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k t&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;                                       ke &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; e &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k e&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; ke _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; ke &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; e &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                             printf &lt;span style="color:maroon"&gt;&amp;quot;&amp;lt;%d&amp;gt;&amp;quot;&lt;/span&gt; e &lt;br&gt;                             k e&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              expr&lt;/div&gt; &lt;p&gt;Now here it is rewritten using the continuation monad: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Eval expr =   &lt;br&gt;    KFoldExpr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; return x &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kl op kr _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;span style="color:blue"&gt;let&lt;/span&gt;! l = kl &lt;br&gt;                                     &lt;span style="color:blue"&gt;let&lt;/span&gt;! r = kr &lt;br&gt;                                     &lt;span style="color:blue"&gt;match&lt;/span&gt; op &lt;span style="color:blue"&gt;with&lt;/span&gt;  &lt;br&gt;                                     &lt;span style="color:blue"&gt;|&lt;/span&gt; Plus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; return l+r &lt;br&gt;                                     &lt;span style="color:blue"&gt;|&lt;/span&gt; Minus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; return l-r &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kc kt ke _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;span style="color:blue"&gt;let&lt;/span&gt;! c = kc &lt;br&gt;                                     &lt;span style="color:blue"&gt;if&lt;/span&gt; c &amp;lt;&amp;gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;                                         return! kt &lt;br&gt;                                     &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;                                         return! ke &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; ke _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;span style="color:blue"&gt;let&lt;/span&gt;! e = ke  &lt;br&gt;                               &lt;span style="color:blue"&gt;do&lt;/span&gt; printf &lt;span style="color:maroon"&gt;&amp;quot;&amp;lt;%d&amp;gt;&amp;quot;&lt;/span&gt; e &lt;br&gt;                               return e &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              expr&lt;/div&gt; &lt;p&gt;This reads so much better.  In the case of binary operators (the second lambda), for example, I can read the code &amp;quot;aloud&amp;quot; as something like &amp;quot;Let 'l' be the value of the recursive call on the left-hand subtree, and let 'r' be the value of the recursive call on the right-hand subtree.  If the operator is 'Plus', return 'l+r', else return 'l-r'.&amp;quot;  The previous version with explicit continuations, though equivalent, is much harder to decipher, and doesn't let you &amp;quot;read it aloud&amp;quot; nearly so easily. &lt;p&gt;Another thing worth pointing out in this example is the use of the &amp;quot;return!&amp;quot; keyword.  In the case of if-then-else expressions (the third lambda), the &amp;quot;read aloud&amp;quot; version goes something like &amp;quot;Let 'c' be the value of the recursive call on the condition expression.  If 'c' is non-zero, then the result is the value of recursing on the 'then' subtree, else the result is the value of recursing on the 'else' subtree.&amp;quot;  Since &amp;quot;kt&amp;quot; and &amp;quot;ke&amp;quot; are monadic values (they are continuations that represent the recursive calls into the 'Then' and 'Else' subtrees), we use the &amp;quot;!&amp;quot; version of &amp;quot;return&amp;quot; to return the value.   &lt;h5&gt;The source code&lt;/h5&gt; &lt;p&gt;Here's the code from today's blog entry. &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;#light&lt;/span&gt;  &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; ContinuationBuilder&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Return&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Let&lt;span style="color:blue"&gt;(&lt;/span&gt;x,f&lt;span style="color:blue"&gt;)&lt;/span&gt; = f x &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Bind&lt;span style="color:blue"&gt;(&lt;/span&gt;m,f&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; m &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; a &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; f a k&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;member&lt;/span&gt; this&lt;span style="color:blue"&gt;.&lt;/span&gt;Delay&lt;span style="color:blue"&gt;(&lt;/span&gt;f&lt;span style="color:blue"&gt;)&lt;/span&gt; = f&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; K = &lt;span style="color:blue"&gt;new&lt;/span&gt; ContinuationBuilder&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// handy operator &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;===&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;fun&lt;/span&gt; x y &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; Object&lt;span style="color:blue"&gt;.&lt;/span&gt;ReferenceEquals&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; Tree&amp;lt;'a&amp;gt; =  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Node &lt;span style="color:blue"&gt;of&lt;/span&gt; &lt;span style="color:green"&gt;(*data*)&lt;/span&gt;'a * &lt;span style="color:green"&gt;(*left*)&lt;/span&gt;Tree&amp;lt;'a&amp;gt; * &lt;span style="color:green"&gt;(*right*)&lt;/span&gt;Tree&amp;lt;'a&amp;gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf  &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;//     4 &lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;//  2     6 &lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// 1 3   5 7 &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; tree7 = Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;4&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;2&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;3&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;,  &lt;br&gt;                    Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;6&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;5&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;7&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldTree nodeF leafV tree = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t k = &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; t &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,left,right&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; nodeF x &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop right&lt;span style="color:blue"&gt;)&lt;/span&gt; t k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; leafV t k &lt;br&gt;    Loop tree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// explicit continuations version&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bstExplicitContinuations tree =  &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newL &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt;  &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k t&lt;span style="color:blue"&gt;)&lt;/span&gt; tree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// plain recursive version (blows stack)    &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Change5to0bstUsingStack tree = &lt;br&gt;    &lt;span style="color:blue"&gt;match&lt;/span&gt; tree &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt; newR = Change5to0bstUsingStack oldR &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt; newL = Change5to0bstUsingStack oldL &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;, oldL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; tree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// version using continuation workflow&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bst tree = &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt;! newR = kr                &lt;br&gt;            return Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            &lt;span style="color:blue"&gt;let&lt;/span&gt;! newL = kl &lt;br&gt;            return Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            return Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;}&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; return t &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; tree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// CreateZeroRightTree : int -&amp;gt; Tree&amp;lt;int&amp;gt;&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; CreateZeroRightTree size = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t n = &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;n &amp;lt; size&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            Loop &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,Leaf,t&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;n+&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            t &lt;br&gt;    Loop Leaf &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// make a big tree of 2 million nodes all going to the right&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; bigTree = CreateZeroRightTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;2&lt;/span&gt; * &lt;span style="color:maroon"&gt;1000&lt;/span&gt; * &lt;span style="color:maroon"&gt;1000&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// call our tail-recursive function on it, to prove we get no StackOverflowException&lt;/span&gt; &lt;br&gt;Change5to0bst bigTree &lt;br&gt;&lt;br&gt;&lt;span style="color:gray"&gt;///////////////////////////////////////////////////////////////////////////////////&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// types capable of representing a small integer expression language &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; Op =  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Plus  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Minus  &lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; Expr =  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Literal &lt;span style="color:blue"&gt;of&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; BinaryOp &lt;span style="color:blue"&gt;of&lt;/span&gt; Expr * Op * Expr     &lt;span style="color:green"&gt;// left, op, right &lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; IfThenElse &lt;span style="color:blue"&gt;of&lt;/span&gt; Expr * Expr * Expr &lt;span style="color:green"&gt;// cond, then, else; 0=false in cond &lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Print &lt;span style="color:blue"&gt;of&lt;/span&gt; Expr                    &lt;span style="color:green"&gt;// prints, then returns that value&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; exprs = &lt;span style="color:blue"&gt;[&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;42&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;             BinaryOp&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;, Plus, Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;             IfThenElse&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;, Print&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;42&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;, Print&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;            &lt;span style="color:blue"&gt;]&lt;/span&gt; &lt;br&gt;             &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldExpr litF binF ifF printF expr =  &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop ex k = &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; ex &lt;span style="color:blue"&gt;with&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; litF x ex k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; BinaryOp&lt;span style="color:blue"&gt;(&lt;/span&gt;l,op,r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; binF &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop l&lt;span style="color:blue"&gt;)&lt;/span&gt; op &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop r&lt;span style="color:blue"&gt;)&lt;/span&gt; ex k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; IfThenElse&lt;span style="color:blue"&gt;(&lt;/span&gt;c,t,e&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; ifF &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop c&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop t&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop e&lt;span style="color:blue"&gt;)&lt;/span&gt; ex k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Print&lt;span style="color:blue"&gt;(&lt;/span&gt;e&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; printF &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop e&lt;span style="color:blue"&gt;)&lt;/span&gt; ex k &lt;br&gt;    Loop expr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// EvalExplicitContinuations : Expr -&amp;gt; int &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; EvalExplicitContinuations expr =   &lt;br&gt;    KFoldExpr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k x&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kl op kr _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; l &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                   kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; r &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;match&lt;/span&gt; op &lt;span style="color:blue"&gt;with&lt;/span&gt;  &lt;br&gt;                                   &lt;span style="color:blue"&gt;|&lt;/span&gt; Plus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;l+r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;|&lt;/span&gt; Minus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;l-r&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kc kt ke _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; kc &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; c &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;if&lt;/span&gt; c &amp;lt;&amp;gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;                                       kt &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                       k t&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;                                   &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;                                       ke &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; e &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                                       k e&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; ke _ k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; ke &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; e &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;                             printf &lt;span style="color:maroon"&gt;&amp;quot;&amp;lt;%d&amp;gt;&amp;quot;&lt;/span&gt; e &lt;br&gt;                             k e&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              expr &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// Eval : Expr -&amp;gt; int &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Eval expr =   &lt;br&gt;    KFoldExpr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; return x &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kl op kr _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;span style="color:blue"&gt;let&lt;/span&gt;! l = kl &lt;br&gt;                                     &lt;span style="color:blue"&gt;let&lt;/span&gt;! r = kr &lt;br&gt;                                     &lt;span style="color:blue"&gt;match&lt;/span&gt; op &lt;span style="color:blue"&gt;with&lt;/span&gt;  &lt;br&gt;                                     &lt;span style="color:blue"&gt;|&lt;/span&gt; Plus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; return l+r &lt;br&gt;                                     &lt;span style="color:blue"&gt;|&lt;/span&gt; Minus &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; return l-r &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; kc kt ke _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;span style="color:blue"&gt;let&lt;/span&gt;! c = kc &lt;br&gt;                                     &lt;span style="color:blue"&gt;if&lt;/span&gt; c &amp;lt;&amp;gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;                                         return! kt &lt;br&gt;                                     &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;                                         return! ke &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; ke _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; K &lt;span style="color:blue"&gt;{&lt;/span&gt; &lt;span style="color:blue"&gt;let&lt;/span&gt;! e = ke  &lt;br&gt;                               &lt;span style="color:blue"&gt;do&lt;/span&gt; printf &lt;span style="color:maroon"&gt;&amp;quot;&amp;lt;%d&amp;gt;&amp;quot;&lt;/span&gt; e &lt;br&gt;                               return e &lt;span style="color:blue"&gt;}&lt;/span&gt; &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;              expr &lt;br&gt;                      &lt;br&gt;exprs &lt;span style="color:blue"&gt;|&lt;/span&gt;&amp;gt; List&lt;span style="color:blue"&gt;.&lt;/span&gt;iter &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; expr &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; printfn &lt;span style="color:maroon"&gt;&amp;quot;%d&amp;quot;&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Eval expr&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;&lt;span style="color:green"&gt;// 42 &lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// 2 &lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// &amp;lt;42&amp;gt;42&lt;/span&gt; &lt;br&gt;printfn &lt;span style="color:maroon"&gt;&amp;quot;press a key&amp;quot;&lt;/span&gt; &lt;br&gt;System&lt;span style="color:blue"&gt;.&lt;/span&gt;Console&lt;span style="color:blue"&gt;.&lt;/span&gt;ReadKey&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;|&lt;/span&gt;&amp;gt; ignore&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8076776766069723920&amp;page=RSS%3a+Catamorphisms%2c+part+seven&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lorgonblog.spaces.live.com&amp;amp;GT1=lorgonblog"&gt;</description><comments>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!256.entry#comment</comments><guid isPermaLink="true">http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!256.entry</guid><pubDate>Sat, 07 Jun 2008 21:03:29 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256/comments/feed.rss</wfw:commentRss><wfw:comment>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!256.entry#comment</wfw:comment><dcterms:modified>2008-06-07T21:03:29Z</dcterms:modified></item><item><title>Catamorphisms, part six</title><link>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!251.entry</link><description>&lt;p&gt;Oops!... I did it again. &lt;p&gt;I completely botched a key aspect of my previous blog entry.  Fortunately I have some alert readers who are keeping me honest.  Whereas last time I had to correct a blunder about run-time performance, this time I have to correct my implementation because I failed to make it properly tail-recursive.  It's a learning opportunity, both for you and for me! &lt;h5&gt;The problem&lt;/h5&gt; &lt;p&gt;Last time I showed this code for KFoldTree and Change5to0bst: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldTree nodeF leafV tree =   &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t =   &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; t &lt;span style="color:blue"&gt;with&lt;/span&gt;   &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,left,right&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; nodeF x &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop right&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; t  &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; leafV t  &lt;br&gt;    Loop tree  &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// Change5to0bst : Tree&amp;lt;int&amp;gt; -&amp;gt; Tree&amp;lt;int&amp;gt; &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bst tree =   &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr t &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; = t  &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;   &lt;br&gt;            Node &lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;            kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newL &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt;  &lt;br&gt;            Node &lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt;  &lt;br&gt;            Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; t&lt;span style="color:blue"&gt;)&lt;/span&gt; tree&lt;/div&gt; &lt;p&gt;and I looked very carefully at Change5to0bst to ensure that every call was a tail call.  It is.  The problem is, the &amp;quot;Loop&amp;quot; calls in KFoldTree are not tail calls!  For example: &lt;div style="font-family:courier new"&gt;    &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;Here, we will make a recursive call to &amp;quot;Loop&amp;quot;, but when that call returns, there is still &amp;quot;more work to do&amp;quot; (we must pass that result to &amp;quot;k&amp;quot;).  Thus, Loop is not a tail call here.  Oops!  The implication is that we must allocate a stack frame for the duration of the recursive call.  And so if we write... &lt;div style="font-family:courier new"&gt;&lt;span style="color:green"&gt;// CreateZeroRightTree : int -&amp;gt; Tree&amp;lt;int&amp;gt;&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; CreateZeroRightTree size = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t n = &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;n &amp;lt; size&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            Loop &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,Leaf,t&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;n+&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            t &lt;br&gt;    Loop Leaf &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// make a big tree of 2 million nodes all going to the right&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; bigTree = CreateZeroRightTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;2&lt;/span&gt; * &lt;span style="color:maroon"&gt;1000&lt;/span&gt; * &lt;span style="color:maroon"&gt;1000&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// call our supposedly-tail-recursive function on it&lt;/span&gt; &lt;br&gt;Change5to0bst bigTree&lt;/div&gt; &lt;p&gt;...sure enough - kaboom!  StackOverflowException.  Clearly I failed to test my code from my previous blog entry. &lt;h5&gt;The fix&lt;/h5&gt; &lt;p&gt;The fix involves explicitly passing the continuations throughout the computation.  The definition of KFold actually gets a little simpler, though the client code becomes slightly more complicated.  Here's the new KFold: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldTree nodeF leafV tree = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t k = &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; t &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,left,right&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; nodeF x &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop right&lt;span style="color:blue"&gt;)&lt;/span&gt; t k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; leafV t k &lt;br&gt;    Loop tree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;Relative to the previous (broken) version, &amp;quot;Loop&amp;quot; takes an extra continuation parameter, and passed it as an extra parameter to the client functions (&amp;quot;nodeF&amp;quot; and &amp;quot;leafV&amp;quot;).  Note that the &amp;quot;Loop&amp;quot; calls got simpler, since for example &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;    (&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; Loop left k&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;can just be written as &lt;div style="font-family:courier new"&gt;    &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;/div&gt; &lt;p&gt;thanks to currying. &lt;p&gt;Here is how this affects the client: &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bst tree = &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; = t &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newL &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k t&lt;span style="color:blue"&gt;)&lt;/span&gt; tree&lt;/div&gt; &lt;p&gt;The two client lambdas now take an extra final parameter &amp;quot;k&amp;quot;, and everywhere that the client used to &amp;quot;return a final value&amp;quot;, now we are calling the continuation &amp;quot;k&amp;quot; on that final value.  Apart from that, the code is otherwise unchanged. &lt;h5&gt;The lesson&lt;/h5&gt; &lt;p&gt;Tail recursion is subtle - especially when dealing with mutually recursive functions/lambdas.  If you are going to try to be tail-recursive, test your code on large inputs to ensure you got it right!  I failed to test the new &amp;quot;Eval&amp;quot; function (see below), so as to leave that as a good exercise for you to try - create some large data and find out if I got the definitions of KFoldExpr and Eval right! &lt;h5&gt; &lt;h5&gt;Other bits&lt;/h5&gt;&lt;/h5&gt; &lt;p&gt;Again, we can express XFold in terms of the new (corrected) KFold, and we can generalize this new KFold to other discriminated union types (like Expr).  For examples, see today's source code. &lt;p&gt;Sorry that today's blog entry is so short on prose, but I didn't originally intend to spend time writing a blog entry today.  The error in my previous blog entry was sufficiently grievous, though, that I felt compelled to correct it immediately.  &lt;h5&gt;The source code&lt;/h5&gt; &lt;div style="font-family:courier new"&gt;&lt;span style="color:blue"&gt;#light&lt;/span&gt;  &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;open&lt;/span&gt; System &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// handy operator &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;===&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;span style="color:blue"&gt;fun&lt;/span&gt; x y &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; Object&lt;span style="color:blue"&gt;.&lt;/span&gt;ReferenceEquals&lt;span style="color:blue"&gt;(&lt;/span&gt;x,y&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; Tree&amp;lt;'a&amp;gt; =  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Node &lt;span style="color:blue"&gt;of&lt;/span&gt; &lt;span style="color:green"&gt;(*data*)&lt;/span&gt;'a * &lt;span style="color:green"&gt;(*left*)&lt;/span&gt;Tree&amp;lt;'a&amp;gt; * &lt;span style="color:green"&gt;(*right*)&lt;/span&gt;Tree&amp;lt;'a&amp;gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf  &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;//     4 &lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;//  2     6 &lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// 1 3   5 7 &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; tree7 = Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;4&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;2&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;3&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;,  &lt;br&gt;                    Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;6&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;5&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;, Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;7&lt;/span&gt;, Leaf, Leaf&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldTree nodeF leafV tree = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t k = &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; t &lt;span style="color:blue"&gt;with&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,left,right&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; nodeF x &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop left&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop right&lt;span style="color:blue"&gt;)&lt;/span&gt; t k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Leaf &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; leafV t k &lt;br&gt;    Loop tree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; Change5to0bst tree = &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x kl kr t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;let&lt;/span&gt; Node&lt;span style="color:blue"&gt;(&lt;/span&gt;_,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt; = t &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; x &amp;lt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            kr &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newR &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, oldL, newR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        elif x &amp;gt; &lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            kl &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; newL &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x, newL, oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            k &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,oldL,oldR&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k t&lt;span style="color:blue"&gt;)&lt;/span&gt; tree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// CreateZeroRightTree : int -&amp;gt; Tree&amp;lt;int&amp;gt;&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; CreateZeroRightTree size = &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop t n = &lt;br&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;n &amp;lt; size&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;br&gt;            Loop &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;,Leaf,t&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;n+&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;        &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;            t &lt;br&gt;    Loop Leaf &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// make a big tree of 2 million nodes all going to the right&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; bigTree = CreateZeroRightTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;2&lt;/span&gt; * &lt;span style="color:maroon"&gt;1000&lt;/span&gt; * &lt;span style="color:maroon"&gt;1000&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:green"&gt;// call our tail-recursive function on it, to prove we get no StackOverflowException&lt;/span&gt; &lt;br&gt;Change5to0bst bigTree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// XFoldTree : ('a -&amp;gt; 'r -&amp;gt; 'r -&amp;gt; Tree&amp;lt;'a&amp;gt; -&amp;gt; 'r) -&amp;gt; (Tree&amp;lt;'a&amp;gt; -&amp;gt; 'r) -&amp;gt; Tree&amp;lt;'a&amp;gt; -&amp;gt; 'r &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; XFoldTree nodeF leafV tree =  &lt;br&gt;    KFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x l r t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; l &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; lacc &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; r &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; racc &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;nodeF x lacc racc t&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;              &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; t k &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; k &lt;span style="color:blue"&gt;(&lt;/span&gt;leafV t&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; tree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// Other useful Tree boilerplate from previous blogs&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; XNode &lt;span style="color:blue"&gt;(&lt;/span&gt;x,l,r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;Node&lt;span style="color:blue"&gt;(&lt;/span&gt;xo,lo,ro&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;as&lt;/span&gt; orig&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; xo = x &amp;amp;&amp;amp; lo === l &amp;amp;&amp;amp; ro === r &lt;span style="color:blue"&gt;then&lt;/span&gt;  &lt;br&gt;        orig &lt;br&gt;    &lt;span style="color:blue"&gt;else&lt;/span&gt; &lt;br&gt;        Node&lt;span style="color:blue"&gt;(&lt;/span&gt;x,l,r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; XLeaf &lt;span style="color:blue"&gt;(&lt;/span&gt;Leaf &lt;span style="color:blue"&gt;as&lt;/span&gt; orig&lt;span style="color:blue"&gt;)&lt;/span&gt; = &lt;br&gt;    orig &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; FoldTree nodeF leafV tree =  &lt;br&gt;    XFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x l r _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; nodeF x l r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; _ &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; leafV&lt;span style="color:blue"&gt;)&lt;/span&gt; tree &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// another example to suggest that the XFold written in terms of the KFold is also still tail-recursive&lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; XChange5to0 tree =  &lt;br&gt;    XFoldTree &lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;fun&lt;/span&gt; x l r &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; XNode&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;if&lt;/span&gt; x=&lt;span style="color:maroon"&gt;5&lt;/span&gt; &lt;span style="color:blue"&gt;then&lt;/span&gt; &lt;span style="color:maroon"&gt;0&lt;/span&gt; &lt;span style="color:blue"&gt;else&lt;/span&gt; x&lt;span style="color:blue"&gt;)&lt;/span&gt;, l, r&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt; XLeaf tree  &lt;br&gt;XChange5to0 bigTree  &lt;span style="color:green"&gt;// no StackOverflowException&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:gray"&gt;///////////////////////////////////////////////////////////////////////////////////&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:green"&gt;// types capable of representing a small integer expression language &lt;/span&gt; &lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; Op =  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Plus  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Minus  &lt;br&gt;&lt;span style="color:blue"&gt;type&lt;/span&gt; Expr =  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Literal &lt;span style="color:blue"&gt;of&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt;  &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; BinaryOp &lt;span style="color:blue"&gt;of&lt;/span&gt; Expr * Op * Expr     &lt;span style="color:green"&gt;// left, op, right &lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; IfThenElse &lt;span style="color:blue"&gt;of&lt;/span&gt; Expr * Expr * Expr &lt;span style="color:green"&gt;// cond, then, else; 0=false in cond &lt;/span&gt; &lt;br&gt;    &lt;span style="color:blue"&gt;|&lt;/span&gt; Print &lt;span style="color:blue"&gt;of&lt;/span&gt; Expr                    &lt;span style="color:green"&gt;// prints, then returns that value&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; exprs = &lt;span style="color:blue"&gt;[&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;42&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;             BinaryOp&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;, Plus, Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;             IfThenElse&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;1&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;, Print&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;42&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;, Print&lt;span style="color:blue"&gt;(&lt;/span&gt;Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;&lt;span style="color:maroon"&gt;0&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;&lt;span style="color:blue"&gt;)&lt;/span&gt;  &lt;br&gt;            &lt;span style="color:blue"&gt;]&lt;/span&gt; &lt;br&gt;             &lt;br&gt;&lt;span style="color:blue"&gt;let&lt;/span&gt; KFoldExpr litF binF ifF printF expr =  &lt;br&gt;    &lt;span style="color:blue"&gt;let&lt;/span&gt; &lt;span style="color:blue"&gt;rec&lt;/span&gt; Loop ex k =  &lt;br&gt;        &lt;span style="color:blue"&gt;match&lt;/span&gt; ex &lt;span style="color:blue"&gt;with&lt;/span&gt;  &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; Literal&lt;span style="color:blue"&gt;(&lt;/span&gt;x&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; litF x ex k &lt;br&gt;        &lt;span style="color:blue"&gt;|&lt;/span&gt; BinaryOp&lt;span style="color:blue"&gt;(&lt;/span&gt;l,op,r&lt;span style="color:blue"&gt;)&lt;/span&gt; &lt;span style="color:blue"&gt;-&amp;gt;&lt;/span&gt; binF &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop l&lt;span style="color:blue"&gt;)&lt;/span&gt; op &lt;span style="color:blue"&gt;(&lt;/span&gt;Loop r&lt;span style="color:b