<?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>brool &#187; haskell monad</title>
	<atom:link href="http://www.brool.com/index.php/tag/haskell-monad/feed" rel="self" type="application/rss+xml" />
	<link>http://www.brool.com</link>
	<description>brool \brool\ (n.) : a low roar; a deep murmur or humming</description>
	<lastBuildDate>Fri, 20 Jan 2012 07:58:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>State Monads in Haskell</title>
		<link>http://www.brool.com/index.php/state-monads-in-haskell</link>
		<comments>http://www.brool.com/index.php/state-monads-in-haskell#comments</comments>
		<pubDate>Tue, 24 Feb 2009 21:36:25 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[haskell monad]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=169</guid>
		<description><![CDATA[I would like Haskell better if it didn&#8217;t do its best to make me feel stupid. Tasks that are easy in other languages, such, say, maintaining some state or generating a random number, become difficult. After banging my head on the State monad I finally arrived at a kind of understanding, which I put here [...]]]></description>
			<content:encoded><![CDATA[<p>I would like Haskell better if it didn&#8217;t do its best to make me feel stupid.  Tasks that are <i>easy</i> in other languages, such, say, maintaining some state or generating a random number, become difficult.  After banging my head on the State monad I finally arrived at a kind of understanding, which I put here so I can restore context in the future!</p>

<p>Presume that you&#8217;ve got a function that, given a list, returns a list of booleans corresponding to whether the value was the first occurrence in the list.  In Python it would look something like this: </p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="python"><pre class="de1"><span class="kw1">def</span> is_first<span class="br0">&#40;</span>lst<span class="br0">&#41;</span>:
    found <span class="sy0">=</span> <span class="kw2">set</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    r <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
    <span class="kw1">for</span> item <span class="kw1">in</span> lst:
        r.<span class="me1">append</span><span class="br0">&#40;</span>item <span class="kw1">not</span> <span class="kw1">in</span> found<span class="br0">&#41;</span>
        found.<span class="me1">add</span><span class="br0">&#40;</span>item<span class="br0">&#41;</span>
    <span class="kw1">return</span> r</pre></div></div></div></div></div></div></div>



<p>For example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="python"><pre class="de1"><span class="sy0">&gt;&gt;&gt;</span> is_first<span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
<span class="br0">&#91;</span><span class="kw2">True</span><span class="sy0">,</span> <span class="kw2">True</span><span class="sy0">,</span> <span class="kw2">True</span><span class="sy0">,</span> <span class="kw2">False</span><span class="sy0">,</span> <span class="kw2">True</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>




<p>The most simplistic way of converting this to Haskell would require using recursion for the looping, resulting in the following (non-tail-recursive) function:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">first  lst <span class="sy0">=</span> first' lst <span class="br0">&#91;</span><span class="br0">&#93;</span>
first' <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">_</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
first' <span class="br0">&#40;</span>h:t<span class="br0">&#41;</span> state <span class="sy0">=</span> 
       <span class="kw1">if</span> h `<span class="kw3">elem</span>` found <span class="kw1">then</span> False:<span class="br0">&#40;</span>first' t state<span class="br0">&#41;</span>
       <span class="kw1">else</span> True:<span class="br0">&#40;</span>first' t <span class="br0">&#40;</span>h:state<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>The first&#8217; function needs to &#8220;carry around&#8221; state as it loops around.  Now, say that the lookup function is more complicated than we thought, so we break it out into a separate function.  We have to pass around the state to all functions that access it, resulting in:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">first  lst <span class="sy0">=</span> first' lst <span class="br0">&#91;</span><span class="br0">&#93;</span>
first' <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">_</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
first' <span class="br0">&#40;</span>h:t<span class="br0">&#41;</span> state <span class="sy0">=</span> 
       <span class="kw1">if</span> <span class="br0">&#40;</span>isfound h state<span class="br0">&#41;</span> <span class="kw1">then</span> False:<span class="br0">&#40;</span>first' t state<span class="br0">&#41;</span>
       <span class="kw1">else</span> True:<span class="br0">&#40;</span>first' t <span class="br0">&#40;</span>h:state<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
isfound h state <span class="sy0">=</span> h `<span class="kw3">elem</span>` state</pre></div></div></div></div></div></div></div>




<p>Since isfound references the state, then it needs to be passed in explicitly.</p>

<p>I think that my main problem with understanding the State monad was that I kept wanting to treat the state as a global variable;  so, I was thinking of &#8220;s <- get" and "put s" as references to a global stored somewhere, which left me with the question of "where is the initial put that sets the state?"  Instead, though, you should think of "s <- get" and "put s" as references to an implicitly passed parameter. </p>

<p>The State Monad allows this particular pattern to be changed so that the state doesn&#8217;t need to be explicitly passed.   Rewriting:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">state<span class="sy0">_</span>first lst <span class="sy0">=</span> evalState <span class="br0">&#40;</span>state<span class="sy0">_</span>first' lst<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
state<span class="sy0">_</span>first' <span class="br0">&#91;</span><span class="br0">&#93;</span>    <span class="sy0">=</span> <span class="kw3">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
state<span class="sy0">_</span>first' <span class="br0">&#40;</span>h:t<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="kw1">do</span> state <span class="sy0">&lt;-</span> get
                        <span class="kw1">let</span> found <span class="sy0">=</span> h `<span class="kw3">elem</span>` state
                        put <span class="br0">&#40;</span><span class="kw1">if</span> found <span class="kw1">then</span> state <span class="kw1">else</span> <span class="br0">&#40;</span>h:state<span class="br0">&#41;</span><span class="br0">&#41;</span>
                        rest <span class="sy0">&lt;-</span> state<span class="sy0">_</span>first' t
                        <span class="kw3">return</span> <span class="sy0">$</span> <span class="br0">&#40;</span><span class="kw3">not</span> found<span class="br0">&#41;</span>:rest</pre></div></div></div></div></div></div></div>




<p>Basically, given a Haskell function, you can convert it into the state monad by:</p>
<ul>
<li>Removing the explicitly passed state</li>
<li>Changing all references to the state parameter to &#8220;param <- get"</li>
<li>Instead of recursively descending, use &#8220;put new-state-value&#8221;</li>
<li>Calling a state returns using &#8220;<-" to 'strip' the value</li>
</ul>

<p>Now, this doesn&#8217;t seem more elegant, but note that if you have to break functionality out, the state parameter no longer needs to be explicitly passed:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">state<span class="sy0">_</span>first lst <span class="sy0">=</span> evalState <span class="br0">&#40;</span>state<span class="sy0">_</span>first' lst<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
state<span class="sy0">_</span>first' <span class="br0">&#91;</span><span class="br0">&#93;</span>    <span class="sy0">=</span> <span class="kw3">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
state<span class="sy0">_</span>first' <span class="br0">&#40;</span>h:t<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="kw1">do</span> state <span class="sy0">&lt;-</span> get
                        found <span class="sy0">&lt;-</span> isfound h
                        put <span class="br0">&#40;</span><span class="kw1">if</span> found <span class="kw1">then</span> state <span class="kw1">else</span> <span class="br0">&#40;</span>h:state<span class="br0">&#41;</span><span class="br0">&#41;</span>
                        rest <span class="sy0">&lt;-</span> state<span class="sy0">_</span>first' t
                        <span class="kw3">return</span> <span class="sy0">$</span> <span class="br0">&#40;</span><span class="kw3">not</span> found<span class="br0">&#41;</span>:rest
&nbsp;
isfound h <span class="sy0">=</span> <span class="kw1">do</span> state <span class="sy0">&lt;-</span> get
               <span class="kw3">return</span> <span class="sy0">$</span> h `<span class="kw3">elem</span>` state</pre></div></div></div></div></div></div></div>




<p>UPDATED:  following a question on #haskell (which was very friendly, especially to a complete newcomer), the following more elegant ways of solving this came up:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="co1">-- using mapAccum</span>
first lst <span class="sy0">=</span> <span class="kw3">snd</span> <span class="sy0">$</span> mapAccumL first' <span class="br0">&#91;</span><span class="br0">&#93;</span> lst
    <span class="kw1">where</span> first' acc x <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">if</span> found <span class="kw1">then</span> acc <span class="kw1">else</span> x:acc<span class="sy0">,</span> <span class="kw3">not</span> found<span class="br0">&#41;</span>
              <span class="kw1">where</span> found <span class="sy0">=</span> x `<span class="kw3">elem</span>` acc
&nbsp;
<span class="co1">-- with mapM (not exactly equivalent to example)</span>
first lst <span class="sy0">=</span> evalState first' <span class="br0">&#91;</span><span class="br0">&#93;</span>
    <span class="kw1">where</span> first' <span class="sy0">=</span> <span class="kw3">mapM</span> <span class="br0">&#40;</span>\a <span class="sy0">-&gt;</span> <span class="kw1">do</span> state <span class="sy0">&lt;-</span> get; put <span class="br0">&#40;</span>a:state<span class="br0">&#41;</span>; <span class="kw3">return</span> <span class="sy0">$</span> <span class="kw3">not</span> <span class="br0">&#40;</span>a `<span class="kw3">elem</span>` state<span class="br0">&#41;</span><span class="br0">&#41;</span> lst
&nbsp;
<span class="co1">-- with mapM, equivalent to example</span>
first lst <span class="sy0">=</span> evalState first' <span class="br0">&#91;</span><span class="br0">&#93;</span>
    <span class="kw1">where</span> first' <span class="sy0">=</span> <span class="kw3">mapM</span> isfound lst 
          isfound a <span class="sy0">=</span> <span class="kw1">do</span> state <span class="sy0">&lt;-</span> get
                         <span class="kw1">let</span> found <span class="sy0">=</span> a `<span class="kw3">elem</span>` state
                         put <span class="br0">&#40;</span><span class="kw1">if</span> found <span class="kw1">then</span> state <span class="kw1">else</span> <span class="br0">&#40;</span>a:state<span class="br0">&#41;</span><span class="br0">&#41;</span>
                         <span class="kw3">return</span> <span class="sy0">$</span> <span class="kw3">not</span> found</pre></div></div></div></div></div></div></div>




<div class="moreinfo">
<b>For more information:</b><br/>
<a href="http://www.haskell.org/haskellwiki/Roll_your_own_IRC_bot">Roll Your Own IRC Bot</a><br/>
<a href="http://blog.sigfpe.com/2006/05/grok-haskell-monad-transformers.html?showComment=1206303360000">Grok Haskell Monad Transformers</a><br/>
<a href="http://www.engr.mun.ca/~theo/Misc/haskell_and_monads.htm">Monads For The Working Haskell Programmer</a><br/>
<a href="http://www.falvotech.com/content/publications/monads/">Haskell Monads: Another View</a><br/>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/state-monads-in-haskell/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

