<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LAMBDAPHONE &#187; combinator</title>
	<atom:link href="http://coder.bsimmons.name/blog/tag/combinator/feed/" rel="self" type="application/rss+xml" />
	<link>http://coder.bsimmons.name/blog</link>
	<description>fragmentary ideas  ䷿  intellectual what-nots  ䷷  and haskell programming  ䷴</description>
	<lastBuildDate>Tue, 27 Jul 2010 16:58:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>An &#8220;Adaptive&#8221; Move-to-Front Algorithm</title>
		<link>http://coder.bsimmons.name/blog/2009/11/an-adaptive-move-to-front-algorithm/</link>
		<comments>http://coder.bsimmons.name/blog/2009/11/an-adaptive-move-to-front-algorithm/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 05:28:34 +0000</pubDate>
		<dc:creator>jberryman</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[combinator]]></category>
		<category><![CDATA[compression]]></category>

		<guid isPermaLink="false">http://coder.bsimmons.name/blog/?p=273</guid>
		<description><![CDATA[<p><strong>UPDATE:</strong> <em>Thanks to <a href="http://smj.posterous.com/">steve</a> for pointing out that the scheme I describe here is essentially the same as <a href="http://www.ics.uci.edu/~dan/pubs/DC-Sec5.html#Sec_5.2">Algorithm BSTW</a>.</em></p>
<p>I came up with this variation of the <a href="http://coder.bsimmons.name/blog/2009/11/the-move-to-front-mtf-transform/">Move-to-Front transform</a> which doesn&#8217;t require that there be a&#8230; <a href="http://coder.bsimmons.name/blog/2009/11/an-adaptive-move-to-front-algorithm/" class="read_more">   [ R E A D &#124; M O R E ]</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE:</strong> <em>Thanks to <a href="http://smj.posterous.com/">steve</a> for pointing out that the scheme I describe here is essentially the same as <a href="http://www.ics.uci.edu/~dan/pubs/DC-Sec5.html#Sec_5.2">Algorithm BSTW</a>.</em></p>
<p>I came up with this variation of the <a href="http://coder.bsimmons.name/blog/2009/11/the-move-to-front-mtf-transform/">Move-to-Front transform</a> which doesn&#8217;t require that there be a known alphabet of symbols. Instead it builds up the alphabet as it goes along and encounters a new symbol. I&#8217;m sure that this is a known algorithm, as it&#8217;s a fairly obvious variation, but I don&#8217;t know what the proper name for it is, so I&#8217;m calling it an <a href="http://www.cs.sfu.ca/CC/365/li/squeeze/AdaptiveHuff.html">Adaptive</a> Move-to-Front. </p>
<p>I&#8217;m very interested in hearing if this is similar or identical to any other algorithms, so if anyone has any insights, please comment!</p>
<h3>Differences from the Standard MTF Transform:</h3>
<p>The <a href="http://compgt.googlepages.com/mtf">traditional MTF algorithm</a>, as I understand it, uses some known ordered alphabet of symbols (e.g. the bytes from 0-255, or the letters a-z), so presumably, one need not store this alphabet along with the encoded/compressed data. </p>
<p>With the algorithm I describe here though, the final permutation of the alphabet list, output by the encoder, must be retained to decode the message. The encoded message is identical to the output of the traditional MTF transform, <em>except</em> where a symbol is encoded which <em>has not appeared previously</em>.</p>
<p>Here we have zipped the output of the standard MTF (the <code>fst</code>) with the adaptive version (the <code>snd</code>) to make it easy to compare elements:</p>
<blockquote><p><strong>Message:</strong> <em>&#8220;the rrrrain in sssspain falls maaiinly on the plain&#8221;</em></p>
<p><strong>Output</strong> (standard MTF, adaptive):</p>
<p><code>[(116,0),(105,1),(103,2),(35,3),(115,4),(0,0),(0,0),(0,0),(101,5),(107,6),(112,7),(4,4),(2,2),(2,2),(2,2),(116,8),(0,0),(0,0),(0,0),(115,9),(5,5),(5,5),(5,5),(5,5),(109,10),(4,4),(113,11),(0,0),(7,7),(4,4),(114,12),(4,4),(0,0),(7,7),(0,0),(7,7),(6,6),(121,13),(6,6),(116,14),(4,4),(2,2),(14,14),(14,14),(14,14),(3,3),(13,13),(8,8),(10,10),(10,10),(8,8)]</code></p>
</blockquote>
<p>The standard algorithm was working with the ASCII alphabet, so each new symbol is located somewhere far back into the alphabet; it is then moved to the front. In the adaptive version, when we see a new symbol, it is automatically made the next in our running alphabet and then of course moved to the front. </p>
<p>This means that with the adaptive version, for any given stretch from the beginning of the encoded message, we are using the minimal number of different index integers to encode the stream, always choosing the next greatest integer when we require a new one. Here is the output of the adaptive version alone:</p>
<blockquote>
<p><strong>Encoded phrase:</strong><br />
<code><br />
[0,1,2,3,4,0,0,0,5,6,7,4,2,2,2,8,0,0,0,9,5,5,5,5,10,4,<br />
11,0,7,4,12,4,0,7,0,7,6,13,6,14,4,2,14,14,14,3,13,8,<br />
10,10,8]</code></p>
<p><strong>Final permutation of minimal dictionary list:</strong><br />
<code>"nialp ehtoymsfr"</code>
</p></blockquote>
<p>What these means for actual compression schemes on a binary level, I have no idea, but I would like to explore this topic much more. Without further ado, here is some code.</p>
<h3>The Encoder:</h3>
<p><div class="vimblock"><br>
<span class="Comment">&gt;</span>&nbsp;<span class="PreProc">import</span>&nbsp;Data.List<br>
<span class="Comment">&gt;</span>&nbsp;<span class="PreProc">import</span>&nbsp;Control.Arrow<br>
<br></div></p>
<p>This &#8220;adaptive move-to-front&#8221; encoder works in the same way as the standard algorithm, except that we start out with an empty alphabet list and build it up as we see new elements not yet in our list.</p>
<p>Essentially if, while searching for an element, we hit the empty list [], we pretend that the element we were looking for was at the end of the list.</p>
<p>This is exactly what happens in the traditional algorithm: when we try to encode a symbol that we haven&#8217;t yet encountered, we venture into a new part of the alphabet list that we haven&#8217;t touched yet.</p>
<p><div class="vimblock"><br>
<span class="Comment">&gt;</span>&nbsp;encode&nbsp;<span class="Statement">::</span>&nbsp;(<span class="Type">Eq</span>&nbsp;b)<span class="Statement">=&gt;</span>&nbsp;[b]&nbsp;<span class="Statement">-&gt;</span>&nbsp;([b],&nbsp;[<span class="Type">Int</span>])<br>
<span class="Comment">&gt;</span>&nbsp;encode&nbsp;<span class="Statement">=</span>&nbsp;mapAccumL&nbsp;(<span class="Identifier">flip</span>&nbsp;mtf)&nbsp;[]&nbsp;&nbsp;<span class="Type">where</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;We push the current element to the front of the lookup list...<br>
<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp; mtf&nbsp;x&nbsp;<span class="Statement">=</span>&nbsp;first&nbsp;(x<span class="Statement">:</span>)&nbsp;<span class="Statement">.</span>&nbsp;enc&nbsp;<span class="Constant">0</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="Type">where</span><br>
<br>
&nbsp;...after returning the index of the element in the list<br>
&nbsp;along with the new list with the element deleted:<br>
<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enc&nbsp;i&nbsp;[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="Statement">=</span>&nbsp;([],i)&nbsp;&nbsp;<span class="Comment">-- &lt; index as if x was last</span><br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enc&nbsp;i&nbsp;(a<span class="Statement">:</span>as)&nbsp;<span class="Statement">|</span>&nbsp;x&nbsp;<span class="Statement">==</span>&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">=</span>&nbsp;(as,i)&nbsp;&nbsp;<span class="Comment">-- &lt; delete the x element</span><br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="Statement">|</span>&nbsp;<span class="Identifier">otherwise</span>&nbsp;<span class="Statement">=</span>&nbsp;first&nbsp;(a<span class="Statement">:</span>)&nbsp;<span class="Statement">$</span>&nbsp;enc&nbsp;(i<span class="Statement">+</span><span class="Constant">1</span>)&nbsp;as&nbsp;<br>
<br></div></p>
<h3>The Decoder</h3>
<p>Our decoder requires that we pass it the final permutation of the symbol list, along with the encoded list of indexes. It then simply does the reverse of the encoding function.</p>
<p>To decode we follow these steps:</p>
<ol>
<li>    Return the head of the list of symbols</li>
<li>     Re-insert the symbol into the index location specified by the head of the encoded/index list</li>
<li>Move on to the next encoded index, using the new list of symbols. go to (1)</li>
</ol>
<p><div class="vimblock"><br>
<span class="Comment">&gt;</span>&nbsp;<span class="Comment">-- our Adaptive MTF decoder:</span><br>
<span class="Comment">&gt;</span>&nbsp;decode&nbsp;<span class="Statement">::</span>&nbsp;[b]&nbsp;<span class="Statement">-&gt;</span>&nbsp;[<span class="Type">Int</span>]&nbsp;<span class="Statement">-&gt;</span>&nbsp;[b]<br>
<span class="Comment">&gt;</span>&nbsp;decode&nbsp;l&nbsp;<span class="Statement">=</span>&nbsp;<span class="Identifier">snd</span>&nbsp;<span class="Statement">.</span>&nbsp;mapAccumR&nbsp;dec&nbsp;l&nbsp;<span class="Type">where</span><br>
<br>
&nbsp;return head of alphabet and insert it back into alphabet list at <br>
&nbsp;the index given by the current element of our encoded index list:<br>
<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;dec&nbsp;(a<span class="Statement">:</span>as)&nbsp;i&nbsp;<span class="Statement">=</span>&nbsp;(insertAt&nbsp;a&nbsp;i&nbsp;as,&nbsp;a)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;takes an element and makes it the new element at the specified index<br>
&nbsp;in the provided list. Fails if it touches a [].<br>
<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;insertAt&nbsp;<span class="Statement">::</span>&nbsp;a&nbsp;<span class="Statement">-&gt;</span>&nbsp;<span class="Type">Int</span>&nbsp;<span class="Statement">-&gt;</span>&nbsp;[a]&nbsp;<span class="Statement">-&gt;</span>&nbsp;[a]<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;insertAt&nbsp;a' i&nbsp;<span class="Statement">=</span>&nbsp;ins&nbsp;i<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Type">where</span>&nbsp;ins&nbsp;<span class="Constant">0</span>&nbsp;as&nbsp;<span class="Statement">=</span>&nbsp;a'<span class="Statement">:</span>as<br>
<span class="Comment">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins&nbsp;i' (a<span class="Statement">:</span>as)&nbsp;<span class="Statement">=</span>&nbsp;a&nbsp;<span class="Statement">:</span>&nbsp;ins&nbsp;(i' <span class="Statement">-</span>&nbsp;<span class="Constant">1</span>)&nbsp;as<br>
<br></div></p>
]]></content:encoded>
			<wfw:commentRss>http://coder.bsimmons.name/blog/2009/11/an-adaptive-move-to-front-algorithm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The State Monad: a tutorial for the confused?</title>
		<link>http://coder.bsimmons.name/blog/2009/10/the-state-monad-a-tutorial-for-the-confused/</link>
		<comments>http://coder.bsimmons.name/blog/2009/10/the-state-monad-a-tutorial-for-the-confused/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 00:16:57 +0000</pubDate>
		<dc:creator>jberryman</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[combinator]]></category>
		<category><![CDATA[monads]]></category>
		<category><![CDATA[state]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://coder.bsimmons.name/blog/?p=230</guid>
		<description><![CDATA[<p><em>I&#8217;ve written this <del>brief</del> tutorial on haskell&#8217;s <code>State</code> monad to help bridge some of the elusive gaps that I encountered in other explanations I&#8217;ve read, and to try to cut through all the sticky abstraction. This is written for someone</em>&#8230; <a href="http://coder.bsimmons.name/blog/2009/10/the-state-monad-a-tutorial-for-the-confused/" class="read_more">   [ R E A D &#124; M O R E ]</a></p>]]></description>
			<content:encoded><![CDATA[<p><em>I&#8217;ve written this <del>brief</del> tutorial on haskell&#8217;s <code>State</code> monad to help bridge some of the elusive gaps that I encountered in other explanations I&#8217;ve read, and to try to cut through all the sticky abstraction. This is written for someone who has a good understanding of the <code>Maybe</code> and <code>List</code> monads, but has gotten stuck trying to understand State. I hope it&#8217;s helpful!</em></p>
<h4>The Data Declaration:</h4>
<p>To understand a monad you look at it&#8217;s datatype and then at the definition for bind (<code>>>=</code>). Most monad tutorials start by showing you the data declaration of a <code>State s a</code> in passing, as if it needed no explanation:</p>
<p><blockquote class="vimblock"><br>
<span class="Type">newtype</span>&nbsp;State&nbsp;s&nbsp;a&nbsp;<span class="Statement">=</span>&nbsp;State&nbsp;{&nbsp;runState&nbsp;<span class="Statement">::</span>&nbsp;s&nbsp;<span class="Statement">-&gt;</span>&nbsp;(a,&nbsp;s)&nbsp;}<br>
<br></blockquote></p>
<p>But this <em>does</em> need explanation! This is crazy stuff and nothing like what we&#8217;ve seen before in the list monad or the Maybe monad:</p>
<ol>
<li>The constructor <code>State</code> <strong>holds a function</strong>, not just a simple value like Maybe&#8217;s <code>Just</code>. This looks weird.</li>
<li>Furthermore there is an accessor function <code>runState</code> <strong>with a weirdly imperative-sounding name</strong>.</li>
<li>Finally, there are <strong>two free variables</strong> on the left side, not just one.</li>
</ol>
<p>Yikes! Let&#8217;s try to get our head on straight and figure this out:</p>
<p>First of all the State monad is just <strong>an abstraction for a function that takes a state and returns an intermediate value and some new state value</strong>. To formalize this abstraction in haskell, we wrap the function in the newtype <code>State</code> allowing us to define a <code>Monad</code> instance.</p>
<p>Stepping back from the abstract and conceptual, what we have is <strong>the <code>State</code> constructor acting as a container for a function <code>:: s -> (a,s)</code></strong>, while the definition for bind just provides <strong>a mechanism for &#8220;composing&#8221; a function <code>state -> (val,state)</code> within the <code>State</code> wrapper</strong>.</p>
<p>Just as you can chain together functions using <code>(.)</code> as in <code>(+1) . (*3) . head :: (Num a) => [a] -> a</code>, <strong>the state monad gives you <code>(>>=)</code> to chain together functions that look essentially like <code>:: a -> s -> (a,s) </code>into a single function <code>:: s -> (a,s)</code></strong>.</p>
<p>Let&#8217;s bring the discussion back to actual code and try to make sure we understand those three points of weirdness outlined above. Here&#8217;s a stupid example of a function that can be &#8220;contained&#8221; in our state type:</p>
<p><blockquote class="vimblock"><br>
<span class="Comment">-- look at our counter and return &quot;foo&quot; or &quot;bar&quot;</span><br>
<span class="Comment">-- along with the incremented counter:</span><br>
fromStoAandS&nbsp;<span class="Statement">::</span>&nbsp;<span class="Type">Int</span>&nbsp;<span class="Statement">-&gt;</span>&nbsp;(<span class="Type">String</span>,<span class="Type">Int</span>)<br>
fromStoAandS&nbsp;c&nbsp;<span class="Statement">|</span>&nbsp;c&nbsp;<span class="Statement">`mod`</span>&nbsp;<span class="Constant">5</span>&nbsp;<span class="Statement">==</span>&nbsp;<span class="Constant">0</span>&nbsp;<span class="Statement">=</span>&nbsp;(<span class="Constant">&quot;foo&quot;</span>,c<span class="Statement">+</span><span class="Constant">1</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="Statement">|</span>&nbsp;<span class="Identifier">otherwise</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">=</span>&nbsp;(<span class="Constant">&quot;bar&quot;</span>,c<span class="Statement">+</span><span class="Constant">1</span>)<br>
<br></blockquote></p>
<p>If we just wrap that in a <code>State</code> constructor, we&#8217;re in the State monad:</p>
<p><blockquote class="vimblock"><br>
stateIntString&nbsp;<span class="Statement">::</span>&nbsp;State&nbsp;<span class="Type">Int</span>&nbsp;<span class="Type">String</span><br>
stateIntString&nbsp;<span class="Statement">=</span>&nbsp;State&nbsp;fromStoAandS<br>
<br></blockquote></p>
<p>But what about <code>runState</code>? <strong>All that does of course is give us the &#8220;contents&#8221; of our State constructor: i.e. a single function <code>:: s -> (a,s)</code></strong>. It could have been named <code>stateFunction</code> but someone thought it would be really clever to be able to write things like:</p>
<p><blockquote class="vimblock"><br>
runState&nbsp;stateIntString&nbsp;<span class="Constant">1</span><br>
<br></blockquote></p>
<p>See, all we&#8217;ve done there is used <code>runState</code> to take our function (<code>fromStoAandS</code>) out of the State wrapper; it is then applied it to it&#8217;s initial state (<code>1</code>). We would do this <code>runState</code> business <strong>after building up our composed function with <code>(>>=)</code>, <code>mapM</code>, etc</strong>.</p>
<p>That leaves point 3 unanswered. Let&#8217;s start exploring the instance declaration for State.</p>
<h4>The Instance Declaration</h4>
<p>We&#8217;ll start with the first line:</p>
<p><blockquote class="vimblock"><br>
<span class="Type">instance</span>&nbsp;<span class="Type">Monad</span>&nbsp;(State&nbsp;s)&nbsp;<span class="Type">where</span><br>
<br></blockquote></p>
<p><strong>We create a Monad instance for (State s) not State</strong>. You can think of this as a <strong>partially-applied type</strong>, which is equivalent to a partially applied function: </p>
<blockquote><p><code>(State) <==> (+)</code><br />
<code>(State s) <==> (1+)</code><br />
<code>(State s a) <== (1+2)</code></p></blockquote>
<p><strong>So (<code>State s</code>) is the <code>m</code> in our <code>m a</code>.</strong> This means the <em>type</em> of our state will remain the same as we compose our function with <code>(>>=)</code>, whereas the intermediate values (the <code>a</code>s) may well change type as they move through the chain.</p>
<p>Before we move on to the meat of the instance declaration, I'd like to get your mind calibrated to look at the definitions for <code>return</code> and <code>(>>=)</code>:</p>
<p>Whenever you see <code>m a</code>, as in </p>
<blockquote><p><code>return :: (Monad m) => a -> m a</code> </p></blockquote>
<p>...remember that <code>m a</code> is actually </p>
<blockquote><p><code>State s a</code></p></blockquote>
<p>...and when you remember <code>(State s a)</code>, <em>think</em> </p>
<blockquote><p><code>(s -> (s,a))</code>. </p></blockquote>
<p><strong>So in your mind, <code>m a</code> becomes <code>function :: s -> (a,s)</code> everywhere you see it</strong>. Just forget about the silly State wrapper (<a href="http://www.haskell.org/haskellwiki/Newtype">the compiler does</a>)!</p>
<h4>The definition of return and Bind</h4>
<p>Let's wet out feet with the definition for <code>return</code>:</p>
<p><blockquote class="vimblock"><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">return</span>&nbsp;a&nbsp;<span class="Statement">=</span>&nbsp;State&nbsp;<span class="Statement">$</span>&nbsp;<span class="Statement">\</span>s&nbsp;<span class="Statement">-&gt;</span>&nbsp;(a,&nbsp;s)<br>
<br></blockquote></p>
<p>All return does is take some value a and make a function that takes a state value and returns (value, state value). If we ignore the whole State wrapping business, then return is just <code>(,) :: a -> b -> (a, b)</code></p>
<p>Now recall the definition of bind:</p>
<p><blockquote class="vimblock"><br>
(<span class="Statement">&gt;&gt;=</span>)&nbsp;<span class="Statement">::</span>&nbsp;(<span class="Type">Monad</span>&nbsp;m)&nbsp;<span class="Statement">=&gt;</span>&nbsp;m&nbsp;a&nbsp;<span class="Statement">-&gt;</span>&nbsp;(a&nbsp;<span class="Statement">-&gt;</span>&nbsp;m&nbsp;b)&nbsp;<span class="Statement">-&gt;</span>&nbsp;m&nbsp;b<br>
<br></blockquote></p>
<p>Which in our case is:</p>
<p><blockquote class="vimblock"><br>
(<span class="Statement">&gt;&gt;=</span>)&nbsp;<span class="Statement">::</span>&nbsp;&nbsp;State&nbsp;s&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a&nbsp;<span class="Statement">-&gt;</span>&nbsp;State&nbsp;s&nbsp;b)&nbsp;<span class="Statement">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;State&nbsp;s&nbsp;b<br>
<br></blockquote></p>
<p>And which is just a silly abstraction for the <strong>super special function composition</strong> that's going on, which looks like:</p>
<p><blockquote class="vimblock"><br>
(<span class="Statement">&gt;&gt;=</span>)&nbsp;<span class="Statement">::</span>&nbsp;&nbsp;(s&nbsp;<span class="Statement">-&gt;</span>&nbsp;(a,s))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="Statement">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a&nbsp;<span class="Statement">-&gt;</span>&nbsp;s&nbsp;<span class="Statement">-&gt;</span>&nbsp;(a,s))&nbsp;&nbsp;<span class="Statement">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(s&nbsp;<span class="Statement">-&gt;</span>&nbsp;(b,s))<br>
<br></blockquote></p>
<p>So on the left hand side of (<code>>>=</code>) is a function that takes some initial state and produces a <code>(value,new_state)</code>. On the right hand side is a function that takes that value and that new_state and generates it's own <code>(new_value, newer_state)</code>. <strong>The job of bind is simply to combine those two functions into one bigger function from the initial state to <code>(new_value,newer_state)</code></strong>, just like the simple function composition operator<code> (.) :: (b -> c) -> (a -> b) -> a -> c</code></p>
<p>At this point, we can show you bind's definition:</p>
<p><blockquote class="vimblock"><br>
&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;<span class="Statement">&gt;&gt;=</span>&nbsp;k&nbsp;&nbsp;<span class="Statement">=</span>&nbsp;State&nbsp;<span class="Statement">$</span>&nbsp;<span class="Statement">\</span>s&nbsp;<span class="Statement">-&gt;</span>&nbsp;<span class="Statement">let</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a,&nbsp;s')&nbsp;<span class="Statement">=</span>&nbsp;runState&nbsp;m&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">in</span>&nbsp;runState&nbsp;(k&nbsp;a)&nbsp;s'<br>
<br></blockquote></p>
<p>You can work through that on your own, keeping in mind that we're doing function composition here. The main thing to remember is that the <code>s</code> at the top, right after <code>State</code>, <strong>won't actually be bound to a value until we unwrap the function with <code>runState</code> and pass it the initial state value</strong>, at which point we can evaluate the entire chain.</p>
<h4>A Final Note About The State Monad with <code>do</code> Notation</h4>
<p><code>State</code> is often used like this:</p>
<p><blockquote class="vimblock"><br>
stateFunction&nbsp;<span class="Statement">::</span>&nbsp;State&nbsp;[a]&nbsp;()<br>
stateFunction&nbsp;<span class="Statement">=</span>&nbsp;<span class="Statement">do</span>&nbsp;x&nbsp;<span class="Statement">&lt;-</span>&nbsp;pop<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;x<br>
<br></blockquote></p>
<p>Remember that the functions above are desugaring to <code>m >>= \a-> f... </code>or if there is no left arrow on the previous line: <code>m >>= \_-> f...</code> That <code>a</code> in there is an intermediate value, the <code>fst</code> in the tuple. The push function might look like:</p>
<p><blockquote class="vimblock"><br>
push&nbsp;<span class="Statement">::</span>&nbsp;State&nbsp;[a]&nbsp;()<br>
push&nbsp;a&nbsp;<span class="Statement">=</span>&nbsp;State&nbsp;<span class="Statement">$</span>&nbsp;<span class="Statement">\</span>as&nbsp;<span class="Statement">-&gt;</span>&nbsp;(()&nbsp;,&nbsp;a<span class="Statement">:</span>as)<br>
<br></blockquote></p>
<p>The function doesn't return any meaningful <code>a</code> value, so we don't bind it by using the <code><-</code>. For more work with do notation and some fine pictures, see <a href="http://forums.somethingawful.com/showthread.php?threadid=2841145&#038;pagenumber=6#post346173552">Bonus's post on something awful</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://coder.bsimmons.name/blog/2009/10/the-state-monad-a-tutorial-for-the-confused/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Total Recall combinator</title>
		<link>http://coder.bsimmons.name/blog/2009/04/the-total-recall-combinator/</link>
		<comments>http://coder.bsimmons.name/blog/2009/04/the-total-recall-combinator/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 17:47:05 +0000</pubDate>
		<dc:creator>jberryman</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[combinator]]></category>
		<category><![CDATA[short]]></category>

		<guid isPermaLink="false">http://coder.bsimmons.name/blog/?p=36</guid>
		<description><![CDATA[<blockquote><pre>
infixr 9 .:

(.:) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
(.:) = (.)(.)(.)
</pre>
</blockquote>
<p>This can be used to compose a string of functions with a binary function&#8230; <a href="http://coder.bsimmons.name/blog/2009/04/the-total-recall-combinator/" class="read_more">   [ R E A D &#124; M O R E ]</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><pre>
infixr 9 .:

(.:) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
(.:) = (.)(.)(.)
</pre>
</blockquote>
<p>This can be used to compose a string of functions with a binary function stuck on the end. For example:</p>
<blockquote><pre>
lookupPlusOne :: (Ord k, Monad m, Num n) => k -> Map k n -> m n
lookupPlusOne = liftM (+1) .: lookup
</pre>
</blockquote>
<p>(picked up from some folks on <a href="http://www.haskell.org/haskellwiki/IRC_channel" target="_blank">#haskell</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://coder.bsimmons.name/blog/2009/04/the-total-recall-combinator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
