<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
<head>
<title>Monadic Programming</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<link rel="shortcut icon" href="icon.ico" />
<script src="common_en.js" charset="utf-8" type="text/javascript"></script> 
<link rel="stylesheet" href="common.css" type="text/css" />
</head>
<body onload="javascript:resetForms(); javascript:slidy_init();">
<div><h1 class="cover">Monadic Programming</h1>
<div id="info"></div>
<ul>
<li><a href="#intuition-monads-for-structuring-programs">Intuition: Monads for Structuring Programs</a></li>
<li><a href="#further-monads-by-examples">Further Monads by Examples</a><ul>
<li><a href="#state"><code>State</code></a></li>
<li><a href="#reader"><code>Reader</code></a></li>
<li><a href="#maybe"><code>Maybe</code></a></li>
<li><a href="#list"><code>List</code></a></li>
<li><a href="#identity"><code>Identity</code></a></li>
</ul></li>
<li><a href="#the-monad-type-class">The <code>Monad</code> Type Class</a></li>
<li><a href="#the-do-notation">The <code>do</code> Notation</a></li>
<li><a href="#monad-laws">Monad Laws</a></li>
<li><a href="#adding-instances-for-the-monad-class">Adding Instances for the <code>Monad</code> Class</a><ul>
<li><a href="#exercise">Exercise</a></li>
<li><a href="#exercise-1">Exercise</a></li>
</ul></li>
</ul>
</div>
<section id="intuition-monads-for-structuring-programs" class="level1">
<h1>Intuition: Monads for Structuring Programs</h1>
<p>Monads were initially introduced to express input/output programs in a nicer way. Imagine we would like to write the following program in Haskell:</p>
<pre><code>display the user a message: &quot;Provide me a word&gt; &quot;
read the word (input)
decide if the given word is a palindrome:
- display the following message if it is: &quot;A palindrome.&quot;
- otherwise display this one instead: &quot;Not a palindrome.&quot;</code></pre>
<p>An option to do so is to work with an explicit parameter that represents a global state, called <code>World</code>. This global state is to contain the actual state of the computer’s memory, so it can be used to get the contents of the keyboard’s input buffer so as to put messages on the screen.</p>
<p>Consider we have the following functions available:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="co">-- display a message on the screen</span></a>
<a class="sourceLine" id="cb2-2" data-line-number="2">putStr<span class="ot">  ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">World</span> <span class="ot">-&gt;</span> <span class="dt">World</span></a>
<a class="sourceLine" id="cb2-3" data-line-number="3"><span class="co">-- read a line from the keyboard</span></a>
<a class="sourceLine" id="cb2-4" data-line-number="4">getLine<span class="ot"> ::</span> <span class="dt">World</span> <span class="ot">-&gt;</span> (<span class="dt">String</span>, <span class="dt">World</span>)</a></code></pre></div>
<p>So the program would be something like this:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="ot">($) ::</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> b</a>
<a class="sourceLine" id="cb3-2" data-line-number="2">f <span class="fu">$</span> x <span class="fu">=</span> f x</a>
<a class="sourceLine" id="cb3-3" data-line-number="3"></a>
<a class="sourceLine" id="cb3-4" data-line-number="4"><span class="ot">program ::</span> <span class="dt">World</span> <span class="ot">-&gt;</span> <span class="dt">World</span></a>
<a class="sourceLine" id="cb3-5" data-line-number="5">program w <span class="fu">=</span></a>
<a class="sourceLine" id="cb3-6" data-line-number="6">  (\(s, w) <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb3-7" data-line-number="7">    <span class="kw">if</span> (s <span class="fu">==</span> reverse s)</a>
<a class="sourceLine" id="cb3-8" data-line-number="8">      <span class="kw">then</span> putStr <span class="st">&quot;A palindrome.&quot;</span> w</a>
<a class="sourceLine" id="cb3-9" data-line-number="9">      <span class="kw">else</span> putStr <span class="st">&quot;Not a palindrome.&quot;</span> w) <span class="fu">$</span></a>
<a class="sourceLine" id="cb3-10" data-line-number="10">  getLine <span class="fu">$</span></a>
<a class="sourceLine" id="cb3-11" data-line-number="11">  putStr <span class="st">&quot;Provide me a word&gt; &quot;</span> <span class="fu">$</span> w</a></code></pre></div>
<p>But this may appear inconvenient as everything has to be written backwards due to the regular function composition. Let us flip the composition:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="ot">(|&gt;) ::</span> a <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> b</a>
<a class="sourceLine" id="cb4-2" data-line-number="2">x <span class="fu">|&gt;</span> f <span class="fu">=</span> f x</a>
<a class="sourceLine" id="cb4-3" data-line-number="3"></a>
<a class="sourceLine" id="cb4-4" data-line-number="4"><span class="ot">program&#39; ::</span> <span class="dt">World</span> <span class="ot">-&gt;</span> <span class="dt">World</span></a>
<a class="sourceLine" id="cb4-5" data-line-number="5">program&#39; w <span class="fu">=</span> w <span class="fu">|&gt;</span></a>
<a class="sourceLine" id="cb4-6" data-line-number="6">  putStr <span class="st">&quot;Provide me a word&gt; &quot;</span> <span class="fu">|&gt;</span></a>
<a class="sourceLine" id="cb4-7" data-line-number="7">  getLine <span class="fu">|&gt;</span> \(s, w) <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb4-8" data-line-number="8">  <span class="kw">if</span> (s <span class="fu">==</span> reverse s)</a>
<a class="sourceLine" id="cb4-9" data-line-number="9">    <span class="kw">then</span> putStr <span class="st">&quot;A palindrome.&quot;</span> w</a>
<a class="sourceLine" id="cb4-10" data-line-number="10">    <span class="kw">else</span> putStr <span class="st">&quot;Not a palindrome.&quot;</span> w</a></code></pre></div>
<p>The situation may be improved further by making the <code>w</code> parameter (of type <code>World</code>) implicit.</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">type</span> <span class="dt">IO</span> a <span class="fu">=</span> <span class="dt">World</span> <span class="ot">-&gt;</span> (a, <span class="dt">World</span>)</a></code></pre></div>
<p>Let us rewrite the flipped composition operation to handle the implicit parameter.</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="ot">(&gt;&gt;=) ::</span> <span class="dt">IO</span> a <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> <span class="dt">IO</span> b) <span class="ot">-&gt;</span> <span class="dt">IO</span> b</a>
<a class="sourceLine" id="cb6-2" data-line-number="2">(f <span class="fu">&gt;&gt;=</span> g) w <span class="fu">=</span> (g x) w&#39;</a>
<a class="sourceLine" id="cb6-3" data-line-number="3">  <span class="kw">where</span> (x, w&#39;) <span class="fu">=</span> f w</a></code></pre></div>
<p>Sometimes the result of the <code>IO a</code> function could be ignored as it would be unit (<code>()</code>). Hence a derived operator is introduced in addition.</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="ot">(&gt;&gt;) ::</span> <span class="dt">IO</span> a <span class="ot">-&gt;</span> <span class="dt">IO</span> b <span class="ot">-&gt;</span> <span class="dt">IO</span> b</a>
<a class="sourceLine" id="cb7-2" data-line-number="2">f <span class="fu">&gt;&gt;</span> g <span class="fu">=</span> f <span class="fu">&gt;&gt;=</span> \_ <span class="ot">-&gt;</span> g</a></code></pre></div>
<p>Now the whole program can be rewritten like that:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb8-1" data-line-number="1">putStr<span class="ot">  ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">IO</span> ()</a>
<a class="sourceLine" id="cb8-2" data-line-number="2">getLine<span class="ot"> ::</span> <span class="dt">IO</span> <span class="dt">String</span></a>
<a class="sourceLine" id="cb8-3" data-line-number="3"></a>
<a class="sourceLine" id="cb8-4" data-line-number="4"><span class="ot">program&#39;&#39; ::</span> <span class="dt">IO</span> ()</a>
<a class="sourceLine" id="cb8-5" data-line-number="5">program&#39;&#39; <span class="fu">=</span></a>
<a class="sourceLine" id="cb8-6" data-line-number="6">  putStr <span class="st">&quot;Provide me a word&gt; &quot;</span> <span class="fu">&gt;&gt;</span></a>
<a class="sourceLine" id="cb8-7" data-line-number="7">  getLine <span class="fu">&gt;&gt;=</span> \s <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb8-8" data-line-number="8">  <span class="kw">if</span> (s <span class="fu">==</span> reverse s)</a>
<a class="sourceLine" id="cb8-9" data-line-number="9">    <span class="kw">then</span> putStr <span class="st">&quot;A palindrome.&quot;</span></a>
<a class="sourceLine" id="cb8-10" data-line-number="10">    <span class="kw">else</span> putStr <span class="st">&quot;Not a palindrome.&quot;</span></a></code></pre></div>
<p>Note that the type of <code>program''</code> is <code>IO ()</code>, which basically resolves to <code>World -&gt; ((), World)</code>. That is, something has to provide an initial state that the program could pass along. Given that it is the global state of the entire program, this could be only done by the run-time system.</p>
<p>But that is it! For comparison, observe the corresponding real-life Haskell program.</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="ot">main ::</span> <span class="dt">IO</span> ()</a>
<a class="sourceLine" id="cb9-2" data-line-number="2">main <span class="fu">=</span> <span class="kw">do</span></a>
<a class="sourceLine" id="cb9-3" data-line-number="3">  putStr <span class="st">&quot;Provide me a word&gt; &quot;</span></a>
<a class="sourceLine" id="cb9-4" data-line-number="4">  s <span class="ot">&lt;-</span> getLine</a>
<a class="sourceLine" id="cb9-5" data-line-number="5">  <span class="kw">if</span> (s <span class="fu">==</span> reverse s)</a>
<a class="sourceLine" id="cb9-6" data-line-number="6">    <span class="kw">then</span> putStr <span class="st">&quot;A palindrome.&quot;</span></a>
<a class="sourceLine" id="cb9-7" data-line-number="7">    <span class="kw">else</span> putStr <span class="st">&quot;Not a palindrome.&quot;</span></a></code></pre></div>
</section>
<section id="further-monads-by-examples" class="level1">
<h1>Further Monads by Examples</h1>
<p>But monads are more than just that. Monads represent <em>computation</em>s that have to be <em>run</em> in order to get their results and the associated side effect. For <code>IO</code>, the run function is hidden, but that is because <code>IO</code> is special. All the other monads are not.</p>
<section id="state" class="level2">
<h2><code>State</code></h2>
<p><code>State</code> captures the essence of the <code>IO</code> type, but it is with an explicit initial state, and it can be also parametrized over the actual type of the global state.</p>
<p>There has been also a <code>return</code> function added which is to move some value of type <code>a</code> inside the computation. It is often used for providing the final value of the computation.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">type</span> <span class="dt">State</span> s a <span class="fu">=</span> s <span class="ot">-&gt;</span> (a, s)</a>
<a class="sourceLine" id="cb10-2" data-line-number="2"></a>
<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="co">--       (s -&gt; (a, s)) -&gt; (a -&gt; (s -&gt; (b, s))) -&gt; (s -&gt; (b, s))</span></a>
<a class="sourceLine" id="cb10-4" data-line-number="4"><span class="ot">(&gt;&gt;=) ::</span> <span class="dt">State</span> s a     <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> <span class="dt">State</span> s b)     <span class="ot">-&gt;</span> <span class="dt">State</span> s b</a>
<a class="sourceLine" id="cb10-5" data-line-number="5">(x <span class="fu">&gt;&gt;=</span> f) s <span class="fu">=</span> (f v) s&#39;</a>
<a class="sourceLine" id="cb10-6" data-line-number="6">  <span class="kw">where</span> (v, s&#39;) <span class="fu">=</span> x s</a>
<a class="sourceLine" id="cb10-7" data-line-number="7"></a>
<a class="sourceLine" id="cb10-8" data-line-number="8"><span class="co">--        a -&gt; (s -&gt; (a, s))</span></a>
<a class="sourceLine" id="cb10-9" data-line-number="9">return<span class="ot"> ::</span> a <span class="ot">-&gt;</span> <span class="dt">State</span> s a</a>
<a class="sourceLine" id="cb10-10" data-line-number="10">(return x) s <span class="fu">=</span> (x, s)</a></code></pre></div>
<p><code>State</code> is usually associated with two further “actions”, which are to manipulate the hidden state.</p>
<p><code>get</code> is to observe the state.</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="co">--     s -&gt; (s, s)</span></a>
<a class="sourceLine" id="cb11-2" data-line-number="2"><span class="ot">get ::</span> <span class="dt">State</span> s s</a>
<a class="sourceLine" id="cb11-3" data-line-number="3">(get) s <span class="fu">=</span> (s, s)</a></code></pre></div>
<p><code>put</code> is to modify the state.</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="co">--     s -&gt; ((), s)</span></a>
<a class="sourceLine" id="cb12-2" data-line-number="2"><span class="ot">put ::</span> s <span class="ot">-&gt;</span> <span class="dt">State</span> s ()</a>
<a class="sourceLine" id="cb12-3" data-line-number="3">(put x) s <span class="fu">=</span> ((), x)</a></code></pre></div>
<p>The effect of <code>State</code> has to be run with an initial state.</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="co">--          (s -&gt; (a, s)) -&gt; s -&gt; (a, s))</span></a>
<a class="sourceLine" id="cb13-2" data-line-number="2"><span class="ot">runState ::</span> <span class="dt">State</span> s a     <span class="ot">-&gt;</span> s <span class="ot">-&gt;</span> (a, s))</a>
<a class="sourceLine" id="cb13-3" data-line-number="3">runState f s <span class="fu">=</span> f s</a></code></pre></div>
<p>Let us see everything together.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="co">--           Int -&gt; (Int, Int)</span></a>
<a class="sourceLine" id="cb14-2" data-line-number="2"><span class="ot">testState ::</span> <span class="dt">State</span> <span class="dt">Int</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb14-3" data-line-number="3">testState <span class="fu">=</span></a>
<a class="sourceLine" id="cb14-4" data-line-number="4">  put <span class="dv">3</span> <span class="fu">&gt;&gt;</span></a>
<a class="sourceLine" id="cb14-5" data-line-number="5">  get <span class="fu">&gt;&gt;=</span> \x <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb14-6" data-line-number="6">  put (x <span class="fu">+</span> <span class="dv">1</span>) <span class="fu">&gt;&gt;</span></a>
<a class="sourceLine" id="cb14-7" data-line-number="7">  get <span class="fu">&gt;&gt;=</span> \y <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb14-8" data-line-number="8">  return (y <span class="fu">+</span> <span class="dv">1</span>)</a></code></pre></div>
<p>Running <code>testState</code>:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','24c9fa4aa0c6b0f04efccb878b275d86','24c9fa4aa0c6b0f04efccb878b275d86');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea24c9fa4aa0c6b0f04efccb878b275d86" value="runState testState 0" /><br /><div class="answer" id="res24c9fa4aa0c6b0f04efccb878b275d86"><code class="result">(5, 4)</code><code> :: </code><code class="type">(Int, Int)</code></div></form>
</section>
<section id="reader" class="level2">
<h2><code>Reader</code></h2>
<p>In contrast to <code>State</code>, <code>Reader</code> is to implement a read-only global variable. In result, no hidden state has to passed, but shared between the subcomputations.</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">type</span> <span class="dt">Reader</span> e a <span class="fu">=</span> e <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb15-2" data-line-number="2"></a>
<a class="sourceLine" id="cb15-3" data-line-number="3"><span class="co">--       (e -&gt; a)   -&gt; (a -&gt; (e -&gt; b))   -&gt; (e -&gt; b)</span></a>
<a class="sourceLine" id="cb15-4" data-line-number="4"><span class="ot">(&gt;&gt;=) ::</span> <span class="dt">Reader</span> e a <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> <span class="dt">Reader</span> e b) <span class="ot">-&gt;</span> <span class="dt">Reader</span> e b</a>
<a class="sourceLine" id="cb15-5" data-line-number="5">(x <span class="fu">&gt;&gt;=</span> f) e <span class="fu">=</span> f (x e) e</a>
<a class="sourceLine" id="cb15-6" data-line-number="6"></a>
<a class="sourceLine" id="cb15-7" data-line-number="7"><span class="co">--        a -&gt; (e -&gt; a)</span></a>
<a class="sourceLine" id="cb15-8" data-line-number="8">return<span class="ot"> ::</span> a <span class="ot">-&gt;</span> <span class="dt">Reader</span> e a</a></code></pre></div>
<p>It has the <code>ask</code> action, which is technically a <code>get</code> for <code>Reader</code>.</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="co">--     e -&gt; e</span></a>
<a class="sourceLine" id="cb16-2" data-line-number="2"><span class="ot">ask ::</span> <span class="dt">Reader</span> e e</a>
<a class="sourceLine" id="cb16-3" data-line-number="3">(ask) e <span class="fu">=</span> e</a></code></pre></div>
<p><code>Reader</code> has to be run similarly to <code>State</code>.</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="co">--           (e -&gt; a)   -&gt; e -&gt; a</span></a>
<a class="sourceLine" id="cb17-2" data-line-number="2"><span class="ot">runReader ::</span> <span class="dt">Reader</span> e a <span class="ot">-&gt;</span> e <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb17-3" data-line-number="3">runReader f e <span class="fu">=</span> f e</a></code></pre></div>
<p>An example of use.</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="ot">testReader ::</span> <span class="dt">Reader</span> (<span class="dt">Int</span>,<span class="dt">Int</span>) <span class="dt">String</span></a>
<a class="sourceLine" id="cb18-2" data-line-number="2">testReader <span class="fu">=</span></a>
<a class="sourceLine" id="cb18-3" data-line-number="3">   ask <span class="fu">&gt;&gt;=</span> \(x,y) <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb18-4" data-line-number="4">   <span class="kw">if</span> (x <span class="fu">&lt;</span> y)</a>
<a class="sourceLine" id="cb18-5" data-line-number="5">     <span class="kw">then</span> return <span class="st">&quot;lesser than&quot;</span></a>
<a class="sourceLine" id="cb18-6" data-line-number="6">     <span class="kw">else</span> return <span class="st">&quot;greater than&quot;</span></a></code></pre></div>
<p>Running <code>testReader</code>:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','510a8fcc87bb411f3ceaa3c55c368652','510a8fcc87bb411f3ceaa3c55c368652');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea510a8fcc87bb411f3ceaa3c55c368652" value="runReader testReader (0,1)" /><br /><div class="answer" id="res510a8fcc87bb411f3ceaa3c55c368652"><code class="result">&quot;lesser than&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','571b676d70088ef60e2329d7852da25b','571b676d70088ef60e2329d7852da25b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea571b676d70088ef60e2329d7852da25b" value="runReader testReader (1,0)" /><br /><div class="answer" id="res571b676d70088ef60e2329d7852da25b"><code class="result">&quot;greater than&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="maybe" class="level2">
<h2><code>Maybe</code></h2>
<p>The <code>Maybe</code> type can be also used as a monad, where it represents computations with optional value. That is, <code>Maybe</code> computations may have or may not have values.</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Maybe</span> a <span class="fu">=</span> <span class="dt">Just</span> a <span class="fu">|</span> <span class="dt">Nothing</span></a>
<a class="sourceLine" id="cb19-2" data-line-number="2"></a>
<a class="sourceLine" id="cb19-3" data-line-number="3"><span class="ot">(&gt;&gt;=) ::</span> <span class="dt">Maybe</span> a <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> <span class="dt">Maybe</span> b) <span class="ot">-&gt;</span> <span class="dt">Maybe</span> b</a>
<a class="sourceLine" id="cb19-4" data-line-number="4">(<span class="dt">Just</span> x) <span class="fu">&gt;&gt;=</span> f <span class="fu">=</span> f x</a>
<a class="sourceLine" id="cb19-5" data-line-number="5"><span class="dt">Nothing</span>  <span class="fu">&gt;&gt;=</span> f <span class="fu">=</span> <span class="dt">Nothing</span></a>
<a class="sourceLine" id="cb19-6" data-line-number="6"></a>
<a class="sourceLine" id="cb19-7" data-line-number="7">return<span class="ot"> ::</span> a <span class="ot">-&gt;</span> <span class="dt">Maybe</span> a</a>
<a class="sourceLine" id="cb19-8" data-line-number="8">return x <span class="fu">=</span> <span class="dt">Just</span> x</a></code></pre></div>
<p>The examples below show how optional value can be chained and how they change the subsequent computations.</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="ot">testMaybe ::</span> <span class="dt">Maybe</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb20-2" data-line-number="2">testMaybe <span class="fu">=</span></a>
<a class="sourceLine" id="cb20-3" data-line-number="3">  <span class="dt">Just</span> <span class="dv">3</span> <span class="fu">&gt;&gt;=</span> \x <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb20-4" data-line-number="4">  <span class="dt">Just</span> <span class="dv">4</span> <span class="fu">&gt;&gt;=</span> \y <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb20-5" data-line-number="5">  return (x <span class="fu">+</span> y)</a>
<a class="sourceLine" id="cb20-6" data-line-number="6"></a>
<a class="sourceLine" id="cb20-7" data-line-number="7"><span class="ot">testMaybe&#39; ::</span> <span class="dt">Maybe</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb20-8" data-line-number="8">testMaybe&#39; <span class="fu">=</span></a>
<a class="sourceLine" id="cb20-9" data-line-number="9">  <span class="dt">Just</span> <span class="dv">3</span>  <span class="fu">&gt;&gt;=</span> \x <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb20-10" data-line-number="10">  <span class="dt">Nothing</span> <span class="fu">&gt;&gt;=</span> \y <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb20-11" data-line-number="11">  return (x <span class="fu">+</span> y)</a></code></pre></div>
<p>Running the examples. <code>Maybe</code> does not have a run function as <code>Maybe</code> values can be interpreted directly.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','994acb316dc7412209c4e7b1417e6cf0','994acb316dc7412209c4e7b1417e6cf0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea994acb316dc7412209c4e7b1417e6cf0" value="testMaybe" /><br /><div class="answer" id="res994acb316dc7412209c4e7b1417e6cf0"><code class="result">Just 7</code><code> :: </code><code class="type">Maybe Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','af653ce2793631ab74cc69ce6fffaf25','af653ce2793631ab74cc69ce6fffaf25');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf653ce2793631ab74cc69ce6fffaf25" value="testMaybe'" /><br /><div class="answer" id="resaf653ce2793631ab74cc69ce6fffaf25"><code class="result">Nothing</code><code> :: </code><code class="type">Maybe Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','a0823d0127c1a3c7db83426c5ce1bf4b','a0823d0127c1a3c7db83426c5ce1bf4b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa0823d0127c1a3c7db83426c5ce1bf4b" value="(Just 3) &gt;&gt;= (\x -&gt; return (x + 1))" /><br /><div class="answer" id="resa0823d0127c1a3c7db83426c5ce1bf4b"><code class="result">Just 4</code><code> :: </code><code class="type">Maybe Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','aa571e5f78e499a1610401d6586b987c','aa571e5f78e499a1610401d6586b987c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaa571e5f78e499a1610401d6586b987c" value="Nothing &gt;&gt;= (\x -&gt; return (x + 1))" /><br /><div class="answer" id="resaa571e5f78e499a1610401d6586b987c"><code class="result">Nothing</code><code> :: </code><code class="type">Maybe Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','cff031ad600347b14cc25c005b9a223e','cff031ad600347b14cc25c005b9a223e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacff031ad600347b14cc25c005b9a223e" value="return 4 :: Maybe Int" /><br /><div class="answer" id="rescff031ad600347b14cc25c005b9a223e"><code class="result">Just 4</code><code> :: </code><code class="type">Maybe Int</code></div></form>
</section>
<section id="list" class="level2">
<h2><code>List</code></h2>
<p>Curiously, the regular list type of Haskell can be considered for composing monadic computations.</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb21-1" data-line-number="1"><span class="kw">data</span> [a] <span class="fu">=</span> a <span class="fu">:</span> [a] <span class="fu">|</span> []</a>
<a class="sourceLine" id="cb21-2" data-line-number="2"></a>
<a class="sourceLine" id="cb21-3" data-line-number="3"><span class="ot">(&gt;&gt;=) ::</span> [a] <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> [b]) <span class="ot">-&gt;</span> [b]</a>
<a class="sourceLine" id="cb21-4" data-line-number="4">[]     <span class="fu">&gt;&gt;=</span> f <span class="fu">=</span> []</a>
<a class="sourceLine" id="cb21-5" data-line-number="5">(x<span class="fu">:</span>xs) <span class="fu">&gt;&gt;=</span> f <span class="fu">=</span> (f x) <span class="fu">++</span> (xs <span class="fu">&gt;&gt;=</span> f)</a>
<a class="sourceLine" id="cb21-6" data-line-number="6"></a>
<a class="sourceLine" id="cb21-7" data-line-number="7">return<span class="ot"> ::</span> a <span class="ot">-&gt;</span> [a]</a>
<a class="sourceLine" id="cb21-8" data-line-number="8">return x <span class="fu">=</span> [x]</a></code></pre></div>
<p>The example below illustrates how lists are interpreted in a monadic context.</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="ot">testList ::</span> [(<span class="dt">Integer</span>, <span class="dt">Integer</span>, <span class="dt">Integer</span>)]</a>
<a class="sourceLine" id="cb22-2" data-line-number="2">testList <span class="fu">=</span></a>
<a class="sourceLine" id="cb22-3" data-line-number="3">  [<span class="dv">1</span>,<span class="dv">2</span>]     <span class="fu">&gt;&gt;=</span> \x <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb22-4" data-line-number="4">  [<span class="dv">10</span>,<span class="dv">20</span>]   <span class="fu">&gt;&gt;=</span> \y <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb22-5" data-line-number="5">  [<span class="dv">100</span>,<span class="dv">200</span>] <span class="fu">&gt;&gt;=</span> \z <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb22-6" data-line-number="6">  return (x, y, z)</a></code></pre></div>
<p>Running <code>testList</code> reveals that it can be even given as a list comprehension.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','ae8f1f1fcddee1bee761d1eb5ec6e065','ae8f1f1fcddee1bee761d1eb5ec6e065');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaae8f1f1fcddee1bee761d1eb5ec6e065" value="testList" /><br /><div class="answer" id="resae8f1f1fcddee1bee761d1eb5ec6e065"><code class="result">[(1, 10, 100), (1, 10, 200), (1, 20, 100), (1, 20, 200),
 (2, 10, 100), (2, 10, 200), (2, 20, 100), (2, 20, 200)]</code><code> :: </code><code class="type">[(Integer, Integer, Integer)]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','f0952abde169859b07b572efc47ec9e6','f0952abde169859b07b572efc47ec9e6');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf0952abde169859b07b572efc47ec9e6" value="[ (x, y, z) | x &lt;- [1,2], y &lt;- [10,20], z &lt;- [100,200] ]" /><br /><div class="answer" id="resf0952abde169859b07b572efc47ec9e6"><code class="result">[(1, 10, 100), (1, 10, 200), (1, 20, 100), (1, 20, 200),
 (2, 10, 100), (2, 10, 200), (2, 20, 100), (2, 20, 200)]</code><code> :: </code><code class="type">[(Integer, Integer, Integer)]</code></div></form>
</section>
<section id="identity" class="level2">
<h2><code>Identity</code></h2>
<p>Finally, a quite trivial monad, <code>Identity</code> can be also given as follows. This monad has no associated side effect, it simply corresponds to the flipped function composition.</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="kw">type</span> <span class="dt">Identity</span> a <span class="fu">=</span> a</a>
<a class="sourceLine" id="cb23-2" data-line-number="2"></a>
<a class="sourceLine" id="cb23-3" data-line-number="3"><span class="co">--       a          -&gt; (a -&gt; b)          -&gt; b</span></a>
<a class="sourceLine" id="cb23-4" data-line-number="4"><span class="ot">(&gt;&gt;=) ::</span> <span class="dt">Identity</span> a <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> <span class="dt">Identity</span> b) <span class="ot">-&gt;</span> <span class="dt">Identity</span> b</a>
<a class="sourceLine" id="cb23-5" data-line-number="5">x <span class="fu">&gt;&gt;=</span> f <span class="fu">=</span> f x</a>
<a class="sourceLine" id="cb23-6" data-line-number="6"></a>
<a class="sourceLine" id="cb23-7" data-line-number="7"><span class="co">--        a -&gt; a</span></a>
<a class="sourceLine" id="cb23-8" data-line-number="8">return<span class="ot"> ::</span> a <span class="ot">-&gt;</span> <span class="dt">Identity</span> a</a>
<a class="sourceLine" id="cb23-9" data-line-number="9">return x <span class="fu">=</span> x</a></code></pre></div>
<p><code>Identity</code> has an run function.</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="co">--             a          -&gt; a</span></a>
<a class="sourceLine" id="cb24-2" data-line-number="2"><span class="ot">runIdentity ::</span> <span class="dt">Identity</span> a <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb24-3" data-line-number="3">runIdentity x <span class="fu">=</span> x</a></code></pre></div>
<p>Here is an example of using <code>Identity</code>.</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="ot">testIdentity ::</span> <span class="dt">Identity</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb25-2" data-line-number="2">testIdentity <span class="fu">=</span></a>
<a class="sourceLine" id="cb25-3" data-line-number="3">  return <span class="dv">1</span> <span class="fu">&gt;&gt;=</span> \x <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb25-4" data-line-number="4">  return <span class="dv">2</span> <span class="fu">&gt;&gt;=</span> \y <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb25-5" data-line-number="5">  return (x <span class="fu">+</span> y)</a></code></pre></div>
<p>Running <code>testIdentity</code>:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Monads_en.hs','ba9df5b3ef7090cb074d12d0291766b5','ba9df5b3ef7090cb074d12d0291766b5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaba9df5b3ef7090cb074d12d0291766b5" value="runIdentity testIdentity" /><br /><div class="answer" id="resba9df5b3ef7090cb074d12d0291766b5"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
</section>
</section>
<section id="the-monad-type-class" class="level1">
<h1>The <code>Monad</code> Type Class</h1>
<p>All the operations used in the previous examples can be summarized in the following type class definition.</p>
<div class="sourceCode" id="cb26"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="kw">class</span> <span class="dt">Monad</span> m <span class="kw">where</span></a>
<a class="sourceLine" id="cb26-2" data-line-number="2"><span class="ot">  return ::</span> a <span class="ot">-&gt;</span> m a</a>
<a class="sourceLine" id="cb26-3" data-line-number="3"><span class="ot">  (&gt;&gt;=)  ::</span> m a <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> m b) <span class="ot">-&gt;</span> m b</a>
<a class="sourceLine" id="cb26-4" data-line-number="4">  <span class="co">-- minimum complete base</span></a>
<a class="sourceLine" id="cb26-5" data-line-number="5"></a>
<a class="sourceLine" id="cb26-6" data-line-number="6"><span class="ot">  (&gt;&gt;)   ::</span> m a <span class="ot">-&gt;</span> m b <span class="ot">-&gt;</span> m b</a>
<a class="sourceLine" id="cb26-7" data-line-number="7">  f <span class="fu">&gt;&gt;</span> g <span class="fu">=</span> f <span class="fu">&gt;&gt;=</span> \_ <span class="ot">-&gt;</span> g</a>
<a class="sourceLine" id="cb26-8" data-line-number="8"></a>
<a class="sourceLine" id="cb26-9" data-line-number="9"><span class="ot">  fail   ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> m a</a>
<a class="sourceLine" id="cb26-10" data-line-number="10">  fail s <span class="fu">=</span> error s</a></code></pre></div>
<p>The <code>fail</code> function is an addition that will be covered below.</p>
</section>
<section id="the-do-notation" class="level1">
<h1>The <code>do</code> Notation</h1>
<p>The <code>do</code> notation is a special syntax implemented to express monadic computations in a more convenient way. Any type that is instance of the <code>Monad</code> class may use this.</p>
<p>Rules of translation:</p>
<pre><code>do { e1; e2 }          --&gt;  e1 &gt;&gt; do { e2 }

do { p &lt;- e1; e2 }     --&gt;  e1 &gt;&gt;= \x -&gt; case x of p -&gt; do { e2 }
                                                   _ -&gt; fail &quot;error&quot;

do { let p = e1; e2 }  --&gt;  let p = e1 in do { e2 }

do { e }               --&gt;  e</code></pre>
<p>The <code>&gt;&gt;=</code> is often called the “programmable semicolon” as the actual semantics is determined by the underlying <code>Monad</code> instance. The <code>fail</code> function is used to interrupt the run of the computation, which could be also overloaded by the actual instance.</p>
<p>The use of semicolons is not a requirement, whole <code>do</code> blocks may be composed by proper indentation (that is, the off-side rule). That is, the following block</p>
<pre><code>do { x &lt;- f; y &lt;- g; z &lt;- h; let t = (x,y,z); return t }</code></pre>
<p>is the same as the one below:</p>
<pre><code>do x &lt;- f
   y &lt;- g
   z &lt;- h
   let t = (x, y, z)
   return t</code></pre>
<p>while it is the same as the composition of the corresponding monadic actions below:</p>
<pre><code>f &gt;&gt;= \x -&gt;
g &gt;&gt;= \y -&gt;
h &gt;&gt;= \z -&gt;
let t = (x, y, z) in
return t</code></pre>
</section>
<section id="monad-laws" class="level1">
<h1>Monad Laws</h1>
<p>In order to use them properly, all the <code>Monad</code> instances shall obey the following rules:</p>
<ul>
<li><p>left identity:</p>
<pre><code> do x &lt;- m            ===    do m
    return x</code></pre></li>
<li><p>right identity:</p>
<pre><code> do y &lt;- return x     ===    do f x
    f y</code></pre></li>
<li><p>associativity:</p>
<pre><code> do y &lt;- do x &lt;- m    ===    do x &lt;- m      ===    do x &lt;- m
            f x                 y &lt;- f x              do y &lt;- f x
    g y                         f y                      g y</code></pre></li>
</ul>
<p>Using the “Kleisli fish” symbol (<code>&gt;=&gt;</code>), the rules become more evident.</p>
<div class="sourceCode" id="cb34"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb34-1" data-line-number="1"><span class="ot">(&gt;=&gt;) ::</span> <span class="dt">Monad</span> m <span class="ot">=&gt;</span> (a <span class="ot">-&gt;</span> m b) <span class="ot">-&gt;</span> (b <span class="ot">-&gt;</span> m c) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> m c)</a>
<a class="sourceLine" id="cb34-2" data-line-number="2">(f <span class="fu">&gt;=&gt;</span> g) x <span class="fu">=</span> f x <span class="fu">&gt;&gt;=</span> g</a></code></pre></div>
<p>That is:</p>
<pre><code>return &gt;=&gt; f     ===   f                (left identity)
f &gt;=&gt; return     ===   f                (right identity)
(f &gt;=&gt; g) &gt;=&gt; h  ===   f &gt;=&gt; (g &gt;=&gt; h)  (associativity)</code></pre>
<p>Failing to satisfy the laws, the compiler may optimize the given <code>Monad</code> type wrongly. Note that the compiler cannot check for those laws, this has to be done by the programmer.</p>
</section>
<section id="adding-instances-for-the-monad-class" class="level1">
<h1>Adding Instances for the <code>Monad</code> Class</h1>
<p>Note that the earlier definitions of the example monads use the same symbol. That is why the <code>Monad</code> type class was created, so they can be now overloaded for each of the types. However, <code>Reader</code>, <code>State</code>, and <code>Identity</code> all represented as functions. Thus neither of them cannot be added as an instance without overlapping with the others.</p>
<p>To work this limitation around, <code>newtype</code> wrappers have to be created. For example, the wrapper and the corresponding <code>Monad</code> instance would be the following for <code>Identity</code>:</p>
<div class="sourceCode" id="cb36"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb36-1" data-line-number="1"><span class="kw">newtype</span> <span class="dt">Identity</span> a <span class="fu">=</span> <span class="dt">Identity</span> a</a>
<a class="sourceLine" id="cb36-2" data-line-number="2"></a>
<a class="sourceLine" id="cb36-3" data-line-number="3"><span class="kw">instance</span> <span class="dt">Monad</span> <span class="dt">Identity</span> <span class="kw">where</span></a>
<a class="sourceLine" id="cb36-4" data-line-number="4">  return x <span class="fu">=</span> <span class="dt">Identity</span> x</a>
<a class="sourceLine" id="cb36-5" data-line-number="5">  x <span class="fu">&gt;&gt;=</span> f <span class="fu">=</span> f (runIdentity x)</a>
<a class="sourceLine" id="cb36-6" data-line-number="6"></a>
<a class="sourceLine" id="cb36-7" data-line-number="7"><span class="ot">runIdentity ::</span> <span class="dt">Identity</span> a <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb36-8" data-line-number="8">runIdentity (<span class="dt">Identity</span> x) <span class="fu">=</span> x</a></code></pre></div>
<section id="exercise" class="level2">
<h2>Exercise</h2>
<p>Create a <code>newtype</code> wrapper for <code>Reader</code> and add the <code>Monad</code> instance for it.</p>
</section>
<section id="exercise-1" class="level2">
<h2>Exercise</h2>
<p>Create a <code>newtype</code> wrapper for <code>State</code> and add the <code>Monad</code> instance for it.</p>
</section>
</section>
</body>
</html>

