<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://cstml.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://cstml.github.io/" rel="alternate" type="text/html" /><updated>2025-04-22T14:56:59+00:00</updated><id>https://cstml.github.io/feed.xml</id><title type="html">~/cstml.dev</title><subtitle>A blog like a sketchbook to keep track of my ideas, findings, and learnings. Suggestions via PRs @github or DM me on twitter.</subtitle><entry><title type="html">Haskell: free vs freer vs tagless final — #1 Scenario &amp;amp; Transformers</title><link href="https://cstml.github.io/haskell/2022/11/29/haskell-battle-1.html" rel="alternate" type="text/html" title="Haskell: free vs freer vs tagless final — #1 Scenario &amp;amp; Transformers" /><published>2022-11-29T00:00:00+00:00</published><updated>2022-11-29T00:00:00+00:00</updated><id>https://cstml.github.io/haskell/2022/11/29/haskell-battle-1</id><content type="html" xml:base="https://cstml.github.io/haskell/2022/11/29/haskell-battle-1.html"><![CDATA[<blockquote>
  <p>The battle of the decouplers.</p>
</blockquote>

<p><img src="https://cdn-images-1.medium.com/max/800/0*RS_RpMcdLl4Q_1oE" alt="No, not these transformers." /></p>

<p>Photo by <a href="https://unsplash.com/@rwlinder?utm_source=medium&amp;utm_medium=referral">Robert Linder</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></p>

<h4 id="pre-intro">Pre-Intro</h4>

<p>Hi, this article is the first of a series showing the same domain problem being modelled with different techniques, I will link the following articles here as they get published:</p>

<ul>
  <li><a href="/haskell/2022/11/29/haskell-battle-1.html">#1 Scenario &amp; Transformers (you are here)</a></li>
  <li>#2 Free (TBC)</li>
  <li>#3 Freer (TBC)</li>
  <li>#4 Tagless Final (TBC)</li>
</ul>

<h4 id="intro">Intro</h4>

<p>Hello, I’ve been wanting to make a post about these Haskell techniques for modelling domain logic and decoupling it from implementation for a while.</p>

<p>This was mostly motivated by the fact that I really like the three (Free, Freer, Tagless Final), but never found an article showing them used side by side, in comparison to a Transformers based implementation. I will try to highlight the pros and cons of each approach, and hopefully by the end you will be able to use whichever technique you deem fit for fun and profit.</p>

<p>So without much further ado let’s jump straight into it.</p>

<h4 id="the-domain"><strong>The Domain</strong></h4>

<p>A thread that connects the three techniques is their purpose. All three are useful techniques for modelling the domain of our problem while abstracting (to be read as omitting) the implementation. Let us take a hypothetical domain and exemplify what we mean by this; so let us write a quick scenario:</p>

<h4 id="the-scenario">The Scenario</h4>

<blockquote>
  <p>Let us imagine we were tasked to implement a very basic calculator. Management together with the design team names this project <strong>BCalc</strong> (sometimes referred to as <strong>BC</strong> because it is incredibly catchy). Being super innovative <strong>BCalc</strong> allows us to:</p>
</blockquote>

<blockquote>
  <ol>
    <li>Add an <em>Int</em> to our result previous result;</li>
  </ol>
</blockquote>

<blockquote>
  <ol>
    <li>Subtract an <em>Int</em> from our result;</li>
  </ol>
</blockquote>

<blockquote>
  <ol>
    <li>Retrieve our result, print it to screen together with some “wicked” prompt;</li>
  </ol>
</blockquote>

<p>Up until now it all makes a lot of sense, but to fully grasp the power of the system we will also append to our above scenario a few more lines, which highlight the flexibility of our approach:</p>

<blockquote>
  <p>At a (much) later date (and close to the deadline), management, together with the client, decide that they would also like to be able to feed a function to <strong>BC</strong>, which modifies the last result. They have very, (very), high plans for <strong>BCalc</strong> — maybe even adding some AI functions to it (mostly because it sounds cool).</p>
</blockquote>

<h4 id="the-transformers-based-implementation">The Transformers based implementation</h4>

<p>Ok, so you know Haskell, you’ve read about <a href="https://hackage.haskell.org/package/transformers">Monad Transformers</a> (not the <a href="https://en.wikipedia.org/wiki/Transformers">Transformers</a> franchise), and you realise that you can model <strong>BCalc</strong> with the use of the <strong>StateT</strong> monad transformer, on top of <strong>IO</strong>. So you get to work and produce the following unique and innovative piece of <em>Intellectual Property</em> that will bring you fame and fortune:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">import</span> <span class="nn">Control.Monad.State</span>

<span class="c1">-- The type of our Programs  </span>
<span class="kr">type</span> <span class="kt">Program</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">StateT</span> <span class="kt">Int</span> <span class="kt">IO</span> <span class="nb">()</span>

<span class="c1">-- Adds an Integer to the last result  </span>
<span class="n">adds</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">adds</span> <span class="n">x</span> <span class="o">=</span> <span class="n">modify</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span><span class="p">)</span>

<span class="c1">-- Subtracts an Integer to the last result  </span>
<span class="n">subtracts</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">subtracts</span> <span class="n">x</span> <span class="o">=</span> <span class="n">modify</span> <span class="o">$</span> <span class="n">flip</span> <span class="p">(</span><span class="o">-</span><span class="p">)</span> <span class="n">x</span>

<span class="c1">-- Prints the result in the best marketed way possible  </span>
<span class="n">printsResult</span> <span class="o">::</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">printsResult</span> <span class="o">=</span> <span class="n">get</span> <span class="o">&gt;&gt;=</span> <span class="nf">\</span><span class="n">r</span> <span class="o">-&gt;</span> <span class="n">liftIO</span> <span class="o">$</span> <span class="n">putStrLn</span> <span class="p">(</span><span class="s">"BC&gt; "</span> <span class="o">&lt;&gt;</span> <span class="n">show</span> <span class="n">r</span><span class="p">)</span>

<span class="c1">-- This is how easy it is to write Programs for BC  </span>
<span class="n">exampleProgram</span> <span class="o">::</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">exampleProgram</span> <span class="o">=</span> <span class="kr">do</span>  
  <span class="n">adds</span> <span class="mi">2</span>  
  <span class="n">adds</span> <span class="mi">3</span>  
  <span class="n">printsResult</span>  
  <span class="n">subtracts</span> <span class="mi">3</span>  
  <span class="n">printsResult</span>
</code></pre></div></div>

<p>You’ve done it (colleagues admire your cunning). Now you can share with management your Transformer based EDSL, and they can have fun writing many (many, many) programs using your exposed API to your <strong>Program</strong> monad. Because you are kind, you also surface to them a function that runs <strong>BC</strong> programs written in your EDSL. In a spur of inspiration you name it <strong>runProgram.</strong></p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Run this to experience BC  </span>
<span class="n">runProgram</span> <span class="o">::</span> <span class="kt">Program</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">IO</span> <span class="n">a</span>  
<span class="n">runProgram</span> <span class="o">=</span> <span class="n">flip</span> <span class="n">evalStateT</span> <span class="mi">0</span>
</code></pre></div></div>

<p>Equipped with <strong>runProgram</strong> and <strong>exampleProgram</strong>, every one spends endless hours of fun writing (and nicely printing) computations that they never even imagined. Like so:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">λ</span><span class="o">&gt;</span> <span class="n">runProgram</span> <span class="n">exampleProgram</span>  
<span class="kt">BC</span><span class="o">&gt;</span> <span class="mi">5</span>  
<span class="kt">BC</span><span class="o">&gt;</span> <span class="mi">2</span>
</code></pre></div></div>

<p>Storms gather when management tell you about the addition of the new feature they’ve decided to add to <strong>BC</strong> (just as you were finishing your ☕️ break, <em>always …</em>). But you are well equipped with perseverance and patience, and diligently go back to work and produce the following missing utility, unlocking the full potential of <strong>BC.</strong></p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Applies a function to last result  </span>
<span class="n">appliesFunction</span> <span class="o">::</span> <span class="p">(</span><span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">appliesFunction</span> <span class="o">=</span> <span class="n">modify</span>
</code></pre></div></div>

<p>Now you can rest at ease, as people can extend <strong>BC</strong> with unfathomed rich functions — as seen in the following example:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- the answer to the Ultimate Question of Life, the Universe, and Everything.  </span>
<span class="n">applyTheAnswer</span> <span class="o">::</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">applyTheAnswer</span> <span class="o">=</span> <span class="n">appliesFunction</span> <span class="p">(</span><span class="n">const</span> <span class="mi">42</span><span class="p">)</span>

<span class="n">exampleProgram2</span> <span class="o">::</span> <span class="kt">Program</span> <span class="nb">()</span>  
<span class="n">exampleProgram2</span> <span class="o">=</span> <span class="kr">do</span>  
  <span class="n">adds</span> <span class="mi">2</span>  
  <span class="n">adds</span> <span class="mi">3</span>  
  <span class="n">printsResult</span>  
  <span class="n">subtracts</span> <span class="mi">3</span>  
  <span class="n">printsResult</span>  
  <span class="n">applyTheAnswer</span>   
  <span class="n">printsResult</span>
</code></pre></div></div>

<p>You can now rest at ease; your colleagues can see why when running:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">λ</span><span class="o">&gt;</span> <span class="n">runProgram</span> <span class="n">exampleProgram2</span>  
<span class="kt">BC</span><span class="o">&gt;</span> <span class="mi">5</span>  
<span class="kt">BC</span><span class="o">&gt;</span> <span class="mi">3</span>  
<span class="kt">BC</span><span class="o">&gt;</span> <span class="mi">42</span>
</code></pre></div></div>

<h4 id="so">So?</h4>

<p>Okay, so what is “<em>wrong”</em> with the above approach? You’ve ended up with a nice abstraction over <strong>BC</strong> that allows people to write programs with your provided API, it is easy to extend and you’ve successfully delivered your product. The answer is: “<em>nothing”</em> is fundamentally wrong with this approach, and it is very trivial to work with and implement.</p>

<p>BUT, on the other hand, there are some issue that I would like to mention, and those are:</p>

<blockquote>
  <p>There is no decoupling between the business logic of <strong>BC</strong> and its implementation.</p>
</blockquote>

<p>In essence there is no way for us to look at a <strong>BC</strong> program and dump its sequence of instructions. Of course, we could add some more transformers on top to keep track of our instructions, or of what we’ve executed up until a point — but that would not be elegant (and we don’t care for stuff which is not elegant).</p>

<p>Imagine having to take our <strong>exampleProgram</strong> or <strong>exampleProgram2</strong> and rewrite them into an intermediary representation where we do fancy optimisations, fusion, and whatnot — we’ve hit an invisible wall. And that is where the decoupling techniques come in handy.</p>

<blockquote>
  <p>Every time we added a new feature to <strong>BC</strong> we got caught up in implementing it.</p>
</blockquote>

<p>I can hear you saying it, and you are right. I could have replaced the provided <strong>Program ()</strong> implementation with <strong>undefined</strong> and kept it abstract, but that’s not really the point. The point is that, now our <strong>Program</strong> has one way and <strong>one way only</strong> to interpret commands, and that is their implementation. If further down the line you needed to change the interpretation of what each instruction does, you would have to do it there, in the implementation itself. You wouldn’t be able to easily keep two <strong>printsResult</strong> implementations in parallel (one for prototyping, and one that shoots lasers), without adding another function <strong>printsResultAndShootsLasers</strong>.</p>

<h4 id="summary">Summary</h4>

<p>So to summarise:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">+</code> easy to do.</li>
  <li><code class="language-plaintext highlighter-rouge">+</code> minimal dependencies.</li>
  <li><code class="language-plaintext highlighter-rouge">+</code> fast — <em>as close to the metal as it gets</em>.</li>
  <li><code class="language-plaintext highlighter-rouge">-</code> inflexible once implemented.</li>
  <li><code class="language-plaintext highlighter-rouge">-</code> does not (elegantly) allow manipulation of the program’s AST.</li>
</ul>

<h4 id="conclusion">Conclusion</h4>

<p>The article has introduced the series of short articles on modelling domain specific logic in Haskell. It has also introduced a (silly) problem, and proposed a trivial Transformers based solution to it. Lastly, the article has also tried to highlight the shortcomings of such an approach, and made us curious about how to deal with them.</p>

<p>Until the next time, <em>may the λ be with you.</em></p>

<h3 id="links">Links</h3>
<ul>
  <li>I originally posted this on <a href="https://medium.com/@cstml/free-vs-freer-vs-tagless-final-in-haskell-1-scenario-transformers-f8bc4495ea7e">medium</a>.</li>
</ul>]]></content><author><name></name></author><category term="haskell" /><category term="haskell" /><category term="edsl" /><category term="monad" /><summary type="html"><![CDATA[The battle of the decouplers.]]></summary></entry><entry><title type="html">Haskell: Monad.</title><link href="https://cstml.github.io/2022/07/18/Haskell-Monad.html" rel="alternate" type="text/html" title="Haskell: Monad." /><published>2022-07-18T00:00:00+00:00</published><updated>2022-07-18T00:00:00+00:00</updated><id>https://cstml.github.io/2022/07/18/Haskell-Monad</id><content type="html" xml:base="https://cstml.github.io/2022/07/18/Haskell-Monad.html"><![CDATA[<blockquote>
  <p><em>Or at least my attempt at explaining it</em></p>
</blockquote>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1">-- The use of this will be explained later</span>
<span class="o">&gt;</span> <span class="kr">import</span> <span class="nn">Control.Monad</span> <span class="p">((</span><span class="o">&lt;=&lt;</span><span class="p">))</span>

</code></pre></div></div>

<p>A monad is a haskell Class - this means it comes with specific methods. Let’s
have a look at what <code class="language-plaintext highlighter-rouge">ghci</code> has to say about it.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="err">λ</span><span class="o">&gt;</span> <span class="o">:</span><span class="n">i</span> <span class="kt">Monad</span>
<span class="kr">class</span> <span class="kt">Applicative</span> <span class="n">m</span> <span class="o">=&gt;</span> <span class="kt">Monad</span> <span class="p">(</span><span class="n">m</span> <span class="o">::</span> <span class="o">*</span> <span class="o">-&gt;</span> <span class="o">*</span><span class="p">)</span> <span class="kr">where</span>
  <span class="p">(</span><span class="o">&gt;&gt;=</span><span class="p">)</span> <span class="o">::</span> <span class="n">m</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">b</span>
  <span class="p">(</span><span class="o">&gt;&gt;</span><span class="p">)</span> <span class="o">::</span> <span class="n">m</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">b</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">b</span>
  <span class="n">return</span> <span class="o">::</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">a</span>
  <span class="cp">{-# MINIMAL (&gt;&gt;=) #-}</span>
  	<span class="c1">-- Defined in ‘GHC.Base’</span>
<span class="kr">instance</span> <span class="kt">Monad</span> <span class="p">(</span><span class="kt">Either</span> <span class="n">e</span><span class="p">)</span> <span class="c1">-- Defined in ‘Data.Either’</span>
<span class="kr">instance</span> <span class="kt">Monad</span> <span class="kt">[]</span> <span class="c1">-- Defined in ‘GHC.Base’</span>
<span class="kr">instance</span> <span class="kt">Monad</span> <span class="kt">Maybe</span> <span class="c1">-- Defined in ‘GHC.Base’</span>
<span class="kr">instance</span> <span class="kt">Monad</span> <span class="kt">IO</span> <span class="c1">-- Defined in ‘GHC.Base’</span>
<span class="kr">instance</span> <span class="kt">Monad</span> <span class="p">((</span><span class="o">-&gt;</span><span class="p">)</span> <span class="n">r</span><span class="p">)</span> <span class="c1">-- Defined in ‘GHC.Base’</span>
<span class="kr">instance</span> <span class="kt">Monoid</span> <span class="n">a</span> <span class="o">=&gt;</span> <span class="kt">Monad</span> <span class="p">((,)</span> <span class="n">a</span><span class="p">)</span> <span class="c1">-- Defined in ‘GHC.Base’</span>

</code></pre></div></div>

<p>Ok, so we know it is a subclass of Applicative, we can see it is implemented for
all of these data structures and it comes with some funky looking operators,
namely:</p>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">(&gt;&gt;=)</code> aka. bind</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">(&gt;&gt;)</code>  which I like to call <em>“and then”</em></p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">return</code> - which is the same as <code class="language-plaintext highlighter-rouge">pure</code> from <code class="language-plaintext highlighter-rouge">Applicative</code></p>
  </li>
</ul>

<p>I could go on and on about the theoretical foundations of it, but I’d rather
focus on a trivial example.</p>

<h2 id="the-identity-monad">The identity Monad</h2>

<p>Let’s define our own Monad from scratch to try to understand how it works - for
this I propose the simplest of all <em>lawful</em> monads - the Identity monad. The
reason why I call it a monad is because it behaves like one - i.e. the instance
of Monad is lawful (don’t get bogged down, yet in terminology - but keep in
mind).</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="kr">data</span> <span class="kt">Identity</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">Identity</span> <span class="n">a</span>

</code></pre></div></div>

<p>As you can see, our Identity data type takes any value and places it
inside. It’s so basic that we can guarantee that if we have an <code class="language-plaintext highlighter-rouge">Identity a</code> we
can always get its content - let’s write a function that does just that:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">getContent</span> <span class="o">::</span> <span class="kt">Identity</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">a</span>
<span class="o">&gt;</span> <span class="n">getContent</span> <span class="p">(</span><span class="kt">Identity</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">x</span>

</code></pre></div></div>

<p>Mentally we can think of Identity as a Box.</p>

<p>So what can we say about it? Well firstly - we can be sure it has a lawful
Functor instance. Given any <code class="language-plaintext highlighter-rouge">Box a</code> and a function <code class="language-plaintext highlighter-rouge">a - &gt; b</code> we can obtain a
<code class="language-plaintext highlighter-rouge">Box b</code>:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="kr">instance</span> <span class="kt">Functor</span> <span class="kt">Identity</span> <span class="kr">where</span>
<span class="o">&gt;</span>   <span class="n">fmap</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Identity</span> <span class="n">a</span><span class="p">)</span>  <span class="o">=</span> <span class="kt">Identity</span> <span class="o">$</span> <span class="n">f</span> <span class="n">a</span> 

</code></pre></div></div>

<p>Nice. We can also see that given any <em>boxed function</em> <code class="language-plaintext highlighter-rouge">Identity (a -&gt; b)</code> and a
<em>boxed value</em> <code class="language-plaintext highlighter-rouge">Identity a</code> we can get a boxed <code class="language-plaintext highlighter-rouge">Identity b</code> value. Furthermore,
given any <code class="language-plaintext highlighter-rouge">a</code> we can always box it into <code class="language-plaintext highlighter-rouge">Identity a</code>. This is an easy win and we
get our <code class="language-plaintext highlighter-rouge">Applicative</code> instance.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="kr">instance</span> <span class="kt">Applicative</span> <span class="kt">Identity</span> <span class="kr">where</span>
<span class="o">&gt;</span>    <span class="p">(</span><span class="kt">Identity</span> <span class="n">f</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="p">(</span><span class="kt">Identity</span> <span class="n">a</span><span class="p">)</span>  <span class="o">=</span> <span class="kt">Identity</span> <span class="o">$</span> <span class="n">f</span> <span class="n">a</span>
<span class="o">&gt;</span>    <span class="n">pure</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">Identity</span> <span class="n">a</span>

</code></pre></div></div>

<p>Ok, so we’ve done all the footwork up until the Monad instance. Let’s have a
closer look at the <em>bind</em> operator <code class="language-plaintext highlighter-rouge">(&gt;&gt;=)</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
  <span class="kt">Monad</span> <span class="n">m</span> <span class="o">=&gt;</span> <span class="p">(</span><span class="o">&gt;&gt;=</span><span class="p">)</span> <span class="o">::</span> <span class="n">m</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">m</span> <span class="n">b</span>

</code></pre></div></div>

<p>If we specialise this operator to what we’re trying to achieve it looks more
like this:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
  <span class="p">(</span><span class="o">&gt;&gt;=</span><span class="p">)</span> <span class="o">::</span> <span class="kt">Identity</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">Identity</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Identity</span> <span class="n">b</span>

</code></pre></div></div>

<p>We have the following, a boxed value <code class="language-plaintext highlighter-rouge">a</code>, a function from <code class="language-plaintext highlighter-rouge">a</code> to a boxed <code class="language-plaintext highlighter-rouge">b</code>,
and at the end the result is a boxed <code class="language-plaintext highlighter-rouge">b</code>. Mentally, we can think of the second
function as something that unboxes the first value, and then returns our new box</p>
<ul>
  <li>let’s see this in our implementation.</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="kr">instance</span> <span class="kt">Monad</span> <span class="kt">Identity</span> <span class="kr">where</span>
<span class="o">&gt;</span>   <span class="p">(</span><span class="o">&gt;&gt;=</span><span class="p">)</span> <span class="p">(</span><span class="kt">Identity</span> <span class="n">value</span><span class="p">)</span> <span class="n">boxingFunction</span> <span class="o">=</span> <span class="n">boxingFunction</span> <span class="n">value</span>


</code></pre></div></div>

<p>Can you see what we’ve done? We’ve unboxed the value, and passed it to our
boxingFunction. Ok, maybe it isn’t very clear - but let’s take a second and have
a chat about it. Our data type Identity is useless - in many ways it could
disappear from all of our implementations because it doesn’t give us much. We
could really push it and say that fundamentally <code class="language-plaintext highlighter-rouge">Identity a</code> and <code class="language-plaintext highlighter-rouge">a</code> are one and
the same thing - only one is wrapped in this mental box and the other isn’t. We
could  say that our bind is</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
  <span class="p">(</span><span class="o">&gt;&gt;=</span><span class="p">)</span> <span class="o">::</span>  <span class="n">a</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">something</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">something</span> <span class="n">b</span>

</code></pre></div></div>

<p>and if we squint we could almost say that in this instance, Identity doesn’t
really give us much more information about anything. We could even say that it’s
<code class="language-plaintext highlighter-rouge">(&amp;) :: a -&gt; (a -&gt; b) -&gt; b</code> from <code class="language-plaintext highlighter-rouge">Data.Function</code>.</p>

<p>In any case - why does this matter - and how is it relevant? Well here’s why it
matters - let’s take Maybe as another example. Say we have the function <code class="language-plaintext highlighter-rouge">half</code>
which returns the half of an even number or <code class="language-plaintext highlighter-rouge">Nothing</code> if it is an odd number.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">maybeHalf</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">Int</span>
<span class="o">&gt;</span> <span class="n">maybeHalf</span> <span class="n">x</span>
<span class="o">&gt;</span>   <span class="o">|</span> <span class="n">even</span> <span class="n">x</span>    <span class="o">=</span> <span class="kt">Just</span> <span class="o">$</span> <span class="n">x</span> <span class="p">`</span><span class="n">div</span><span class="p">`</span> <span class="mi">2</span>
<span class="o">&gt;</span>   <span class="o">|</span> <span class="n">otherwise</span> <span class="o">=</span> <span class="kt">Nothing</span>

</code></pre></div></div>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>

<span class="err">λ</span><span class="o">&gt;</span> <span class="n">maybeHalf</span> <span class="mi">1</span>
<span class="kt">Nothing</span>
<span class="err">λ</span><span class="o">&gt;</span> <span class="n">maybeHalf</span> <span class="mi">2</span>
<span class="kt">Just</span> <span class="mi">1</span>

</code></pre></div></div>

<p>Squinting again we see something which we’ve already seen. <code class="language-plaintext highlighter-rouge">maybeHalf</code>’s type
looks vaguely familiar - indeed its type is the same as the second argument of
<code class="language-plaintext highlighter-rouge">(&gt;&gt;=)</code> namely ` a -&gt; m b<code class="language-plaintext highlighter-rouge"> or in our case </code>a -&gt; Maybe b<code class="language-plaintext highlighter-rouge">, or even more specific
</code>Int -&gt; Maybe Int`. That’s great because now we can use the operator:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">maybeQuarter</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">Int</span>
<span class="o">&gt;</span> <span class="n">maybeQuarter</span> <span class="n">x</span> <span class="o">=</span> <span class="n">maybeHalf</span> <span class="n">x</span> <span class="o">&gt;&gt;=</span> <span class="n">maybeHalf</span>

</code></pre></div></div>

<p>Ok, so what happened now? Think of <code class="language-plaintext highlighter-rouge">(&gt;&gt;=)</code> as taking the result of <code class="language-plaintext highlighter-rouge">maybeHalf x</code>
and passing it to the function <code class="language-plaintext highlighter-rouge">maybeHalf</code> again. That’s neat because, when we
see it action, it actually makes a lot of sense.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="err">λ</span><span class="o">&gt;</span> <span class="n">maybeQuarter</span> <span class="mi">2</span>
<span class="kt">Nothing</span>
<span class="err">λ</span><span class="o">&gt;</span> <span class="n">maybeQuarter</span> <span class="mi">4</span>
<span class="kt">Just</span> <span class="mi">1</span>

</code></pre></div></div>

<h2 id="the-do-notation">The do notation</h2>

<p>Another cool thing Monads unlock is haskell’s do notation. Let’s refactor the
above <code class="language-plaintext highlighter-rouge">maybeQuarter</code> to leverage this.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">maybeQuarterDo</span> <span class="n">x</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>   <span class="n">half</span>    <span class="o">&lt;-</span> <span class="n">maybeHalf</span> <span class="n">x</span>
<span class="o">&gt;</span>   <span class="n">quarter</span> <span class="o">&lt;-</span> <span class="n">maybeHalf</span> <span class="n">half</span>
<span class="o">&gt;</span>   <span class="n">return</span> <span class="n">quarter</span>

</code></pre></div></div>

<p>The two are one and the same function - but in different notations. Look at the
do notation one, and then look at the <code class="language-plaintext highlighter-rouge">bind</code> notation one. Some intuition might
emerge.</p>

<p>Fundamentally, a Monad is a type class that allows us to take an instance of
itself containing a value, and a function from that value to another instance of
itself containing possibly a different value. This allows us to easily compose
monads. One last example</p>

<h2 id="the-fish-">The fish <code class="language-plaintext highlighter-rouge">(&lt;=&lt;)</code></h2>

<p>The fish, is the epitome of what I just said because in the context of a monad
it is the moral equivalent of our composition operator <code class="language-plaintext highlighter-rouge">(.)</code>.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λ&gt; :t (&gt;=&gt;) :: Monad m =&gt; (b -&gt; m c) -&gt; (a -&gt; m b) -&gt; a -&gt; m c
λ&gt; :t (.)   ::            (b -&gt;   c) -&gt; (a -&gt;   b) -&gt; a -&gt;   c

</code></pre></div></div>

<p>You can see it, right? So how could we refactor our <code class="language-plaintext highlighter-rouge">maybeQuarter</code> now?
Whatabout:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">maybeQuarterFish</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">Int</span> 
<span class="o">&gt;</span> <span class="n">maybeQuarterFish</span> <span class="o">=</span> <span class="n">maybeHalf</span> <span class="o">&lt;=&lt;</span> <span class="n">maybeHalf</span>

</code></pre></div></div>

<h2 id="end">End</h2>

<p>That was it. I’m sure it all makes sense now - maybe.</p>]]></content><author><name></name></author><category term="haskell" /><summary type="html"><![CDATA[Or at least my attempt at explaining it]]></summary></entry><entry><title type="html">Haskell: Either.</title><link href="https://cstml.github.io/2021/08/04/Haskell-Either.html" rel="alternate" type="text/html" title="Haskell: Either." /><published>2021-08-04T00:00:00+00:00</published><updated>2021-08-04T00:00:00+00:00</updated><id>https://cstml.github.io/2021/08/04/Haskell-Either</id><content type="html" xml:base="https://cstml.github.io/2021/08/04/Haskell-Either.html"><![CDATA[<p>Either is the <code class="language-plaintext highlighter-rouge">Prelude</code> provided type that allows us to work with functions that
can return <em>either one result or another</em>.</p>

<p>It does this by providing two constructors:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="c1">-- | remember this as it will come in handy later</span>
<span class="o">&gt;</span> <span class="kr">import</span> <span class="nn">Control.Monad</span> <span class="p">(</span><span class="nf">join</span><span class="p">)</span>

<span class="o">&gt;</span> <span class="c1">-- | Ignore the ' as they are there to not clash with the Prelude Either.</span>
<span class="o">&gt;</span> <span class="kr">data</span> <span class="kt">Either'</span> <span class="n">e</span> <span class="n">a</span>
<span class="o">&gt;</span>   <span class="o">=</span> <span class="kt">Left'</span>  <span class="n">e</span>  <span class="c1">-- ^ Left allows us to return an error, or short circuit.</span>
<span class="o">&gt;</span>   <span class="o">|</span> <span class="kt">Right'</span> <span class="n">a</span> <span class="c1">-- ^ Right allows us to return the result</span>

</code></pre></div></div>

<p>For example say we were implementing a (safe) function for division - we could
do it like this:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">division</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="kt">String</span> <span class="kt">Int</span>
<span class="o">&gt;</span> <span class="n">division</span> <span class="n">a</span> <span class="n">b</span> 
<span class="o">&gt;</span>     <span class="o">|</span> <span class="n">b</span> <span class="o">==</span> <span class="mi">0</span>    <span class="o">=</span> <span class="kt">Left</span> <span class="s">"Sorry, cannot divide by 0."</span>
<span class="o">&gt;</span>     <span class="o">|</span> <span class="n">otherwise</span> <span class="o">=</span> <span class="kt">Right</span> <span class="o">$</span> <span class="n">a</span> <span class="p">`</span><span class="n">div</span><span class="p">`</span> <span class="n">b</span>

</code></pre></div></div>

<p>Now if we wanted to use the result we could pattern match:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">x</span> <span class="o">&lt;-</span> <span class="n">pure</span> <span class="o">$</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span>
<span class="o">&gt;</span>     <span class="kr">case</span> <span class="n">x</span> <span class="kr">of</span>
<span class="o">&gt;</span>       <span class="kt">Right</span> <span class="n">x'</span> <span class="o">-&gt;</span> <span class="n">print</span> <span class="n">x'</span>
<span class="o">&gt;</span>       <span class="kt">Left</span> <span class="n">e</span>   <span class="o">-&gt;</span> <span class="n">print</span> <span class="o">$</span> <span class="s">"Oh no:"</span> <span class="o">++</span> <span class="n">e</span>

</code></pre></div></div>

<h2 id="a-better-way-to-use-either">A better way to use either</h2>

<p>OK so that’s pretty good already. We have managed to create a pure function that
takes our sum type, and can handle errors. But <code class="language-plaintext highlighter-rouge">Either</code> actually gives us a neat
function to tidy up that pattern match into a simpler pattern. I am talking here
about <code class="language-plaintext highlighter-rouge">either</code> (which is indeed very similar to <code class="language-plaintext highlighter-rouge">Maybe</code>’s <code class="language-plaintext highlighter-rouge">maybe</code>).</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate2</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate2</span> <span class="o">=</span> <span class="kr">do</span> 
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">x</span> <span class="o">&lt;-</span> <span class="n">pure</span> <span class="o">$</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">leftFn</span> <span class="n">rightFn</span> <span class="n">x</span>
<span class="o">&gt;</span>       <span class="kr">where</span>
<span class="o">&gt;</span>         <span class="n">leftFn</span> <span class="o">=</span> <span class="n">print</span> <span class="o">.</span> <span class="p">(</span><span class="s">"Oh no: "</span> <span class="o">++</span><span class="p">)</span>
<span class="o">&gt;</span>         <span class="n">rightFn</span> <span class="o">=</span> <span class="n">print</span>
<span class="o">&gt;</span>
<span class="o">&gt;</span>  <span class="c1">-- or inlined it would look like this </span>
<span class="o">&gt;</span>
<span class="o">&gt;</span> <span class="n">calculate2'</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate2'</span> <span class="o">=</span> <span class="kr">do</span> 
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">x</span> <span class="o">&lt;-</span> <span class="n">pure</span> <span class="o">$</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="p">(</span><span class="n">print</span> <span class="o">.</span> <span class="p">(</span><span class="s">"Oh no: "</span> <span class="o">++</span><span class="p">))</span> <span class="n">print</span> <span class="n">x</span>

</code></pre></div></div>

<p>Where the first function will be applied to the <code class="language-plaintext highlighter-rouge">Left</code> and the second to the
<code class="language-plaintext highlighter-rouge">Right</code>.</p>

<h2 id="the-applicative-nature-of-either">The Applicative nature of <code class="language-plaintext highlighter-rouge">Either</code></h2>

<p>Say we wanted to check if the result is odd. The <code class="language-plaintext highlighter-rouge">Functor</code> nature of <code class="language-plaintext highlighter-rouge">Either</code>
allows us to access the Right side with the use of <code class="language-plaintext highlighter-rouge">&lt;$&gt;</code> (fmap - see the
previous article).</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate4</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate4</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">print</span> <span class="n">print</span> <span class="o">$</span> <span class="n">odd</span> <span class="o">&lt;$&gt;</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span> 

</code></pre></div></div>

<p>So what happened here is that we <code class="language-plaintext highlighter-rouge">fmap</code>ed the result of the division with
<code class="language-plaintext highlighter-rouge">odd</code>. This is the equivalent of the <code class="language-plaintext highlighter-rouge">Applicative</code>:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate4'</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate4'</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">print</span> <span class="n">print</span> <span class="o">$</span> <span class="n">pure</span> <span class="n">odd</span> <span class="o">&lt;*&gt;</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span> 

</code></pre></div></div>

<p>The great thing about it is that now we can essentially chain functions by using
this new <em>lifting functions</em> pattern, while still maintaining the safe way of
working with <code class="language-plaintext highlighter-rouge">Either</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate4''</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate4''</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">print</span> <span class="n">print</span> <span class="o">$</span> <span class="n">pure</span> <span class="n">oddDisplay</span> <span class="o">&lt;*&gt;</span> <span class="p">(</span><span class="n">pure</span> <span class="n">odd</span> <span class="o">&lt;*&gt;</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span><span class="p">)</span>
<span class="o">&gt;</span>       <span class="kr">where</span>
<span class="o">&gt;</span>         <span class="n">oddDisplay</span> <span class="n">x</span> <span class="o">=</span> <span class="kr">if</span> <span class="n">x</span> <span class="kr">then</span> <span class="s">"Is Odd!"</span> <span class="kr">else</span> <span class="s">"Is not Odd"</span> 

</code></pre></div></div>

<p>Of course this could also be refactored to</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate4'''</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate4'''</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">print</span> <span class="n">print</span> <span class="o">$</span>  <span class="n">pure</span> <span class="p">(</span><span class="n">oddDisplay</span><span class="o">.</span><span class="n">odd</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span>
<span class="o">&gt;</span>       <span class="kr">where</span>
<span class="o">&gt;</span>         <span class="n">oddDisplay</span> <span class="n">x</span> <span class="o">=</span> <span class="kr">if</span> <span class="n">x</span> <span class="kr">then</span> <span class="s">"Is Odd!"</span> <span class="kr">else</span> <span class="s">"Is not Odd"</span> 

</code></pre></div></div>

<h2 id="further-use-of-either">Further use of <code class="language-plaintext highlighter-rouge">Either</code></h2>

<p>Okay, but what if we wanted to chain two <code class="language-plaintext highlighter-rouge">Either</code>s? Well a basic way of doing it
would be again by pattern matching.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate3</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate3</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide the result by: "</span>
<span class="o">&gt;</span>     <span class="n">z</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">x</span> <span class="o">&lt;-</span> <span class="n">pure</span> <span class="o">$</span> <span class="n">division</span> <span class="n">n</span> <span class="n">y</span>
<span class="o">&gt;</span>     <span class="kr">case</span> <span class="n">x</span> <span class="kr">of</span>
<span class="o">&gt;</span>       <span class="kt">Left</span> <span class="n">e</span>   <span class="o">-&gt;</span> <span class="n">print</span> <span class="o">$</span> <span class="s">"Oh no:"</span> <span class="o">++</span> <span class="n">e</span>
<span class="o">&gt;</span>       <span class="kt">Right</span> <span class="n">x'</span> <span class="o">-&gt;</span> <span class="kr">case</span> <span class="n">division</span> <span class="n">x'</span> <span class="n">z</span> <span class="kr">of</span>
<span class="o">&gt;</span>         <span class="kt">Left</span> <span class="n">e</span>   <span class="o">-&gt;</span> <span class="n">print</span> <span class="o">$</span> <span class="s">"Oh no:"</span> <span class="o">++</span> <span class="n">e</span>
<span class="o">&gt;</span>         <span class="kt">Right</span> <span class="n">z'</span> <span class="o">-&gt;</span> <span class="n">print</span> <span class="n">z'</span>

</code></pre></div></div>

<p>But this is a bit weird, because we are repeating ourselves, and we are also
writing a lot of boilerplate code for something which in essence could be done a
lot easier. <em>Here comes the Applicative again.</em></p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate3'</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate3'</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide the result by: "</span>
<span class="o">&gt;</span>     <span class="n">z</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">print</span> <span class="n">print</span> <span class="o">$</span> <span class="n">divide</span> <span class="n">n</span> <span class="n">y</span> <span class="n">z</span>
<span class="o">&gt;</span>       <span class="kr">where</span>
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="kt">String</span> <span class="kt">Int</span>
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">=</span> <span class="n">flat</span> <span class="o">$</span> <span class="n">division</span> <span class="o">&lt;$&gt;</span> <span class="p">(</span><span class="n">division</span> <span class="n">x</span> <span class="n">y</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="n">pure</span> <span class="n">z</span>
<span class="o">&gt;</span>
<span class="o">&gt;</span>         <span class="n">flat</span> <span class="o">::</span> <span class="kt">Either</span> <span class="n">a</span> <span class="p">(</span><span class="kt">Either</span> <span class="n">a</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="n">a</span> <span class="n">b</span>
<span class="o">&gt;</span>         <span class="n">flat</span> <span class="o">=</span> <span class="n">either</span> <span class="kt">Left</span> <span class="n">id</span> 

</code></pre></div></div>

<p>Observe how we had to flatten the result. That’s a nifty trick that allows you
to chain calculations with <code class="language-plaintext highlighter-rouge">Either</code>. Also observe how we had to lift <code class="language-plaintext highlighter-rouge">z</code> into an
<code class="language-plaintext highlighter-rouge">Either</code> to allow us to <code class="language-plaintext highlighter-rouge">&lt;*&gt;</code> into the partially applied <code class="language-plaintext highlighter-rouge">division</code>. (If this
doesn’t make much sense, try and write it from scratch and use the compiler to
guide you through the above). Interesting thing about this <code class="language-plaintext highlighter-rouge">flat</code> is that it
actually is a Monadic property - that is it exists in <code class="language-plaintext highlighter-rouge">Control.Monad</code> as join -
and in essence it takes two nested monads and flattens them into
one. Refactoring:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate3''</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="o">&gt;</span> <span class="n">calculate3''</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="kr">let</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">40</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide "</span> <span class="o">++</span> <span class="n">show</span> <span class="n">n</span> <span class="o">++</span>  <span class="s">" by: "</span>
<span class="o">&gt;</span>     <span class="n">y</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">"Please enter a number to divide the result by: "</span>
<span class="o">&gt;</span>     <span class="n">z</span> <span class="o">&lt;-</span> <span class="n">readLn</span> <span class="o">::</span> <span class="kt">IO</span> <span class="kt">Int</span>
<span class="o">&gt;</span>     <span class="n">either</span> <span class="n">print</span> <span class="n">print</span> <span class="o">$</span> <span class="n">divide</span> <span class="n">n</span> <span class="n">y</span> <span class="n">z</span>
<span class="o">&gt;</span>       <span class="kr">where</span>
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="kt">String</span> <span class="kt">Int</span>
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">=</span> <span class="n">join</span> <span class="o">$</span> <span class="n">division</span> <span class="o">&lt;$&gt;</span> <span class="p">(</span><span class="n">division</span> <span class="n">x</span> <span class="n">y</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="n">pure</span> <span class="n">z</span>

</code></pre></div></div>

<h2 id="the-monad-instance">The Monad Instance</h2>

<p>A last thing worth mentioning is that Either is Monadic as well. How do we
leverage this? Let’s look at another example.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">&gt;</span> <span class="n">calculate5</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="kt">String</span> <span class="kt">Int</span>
<span class="o">&gt;</span> <span class="n">calculate5</span> <span class="n">n</span> <span class="o">=</span> <span class="kr">do</span>
<span class="o">&gt;</span>     <span class="n">x</span> <span class="o">&lt;-</span> <span class="n">n</span> <span class="p">`</span><span class="n">divide</span><span class="p">`</span> <span class="mi">2</span>
<span class="o">&gt;</span>     <span class="n">x</span> <span class="p">`</span><span class="n">divide</span><span class="p">`</span> <span class="mi">2</span>
<span class="o">&gt;</span>       <span class="kr">where</span> 
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Int</span>  <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="kt">String</span> <span class="kt">Int</span>
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="kr">_</span> <span class="mi">0</span> <span class="o">=</span> <span class="kt">Left</span> <span class="s">"Can't divide by 0"</span>
<span class="o">&gt;</span>         <span class="n">divide</span> <span class="n">x</span> <span class="n">y</span> <span class="o">=</span> <span class="n">pure</span> <span class="o">$</span> <span class="n">div</span> <span class="n">x</span> <span class="n">y</span> 

</code></pre></div></div>

<p>What we’re doing here is leveraging do notation to use Either’s Monadic
structure and bind the result of the computation to a temporary <code class="language-plaintext highlighter-rouge">x</code> which gets
divided again - all while maintaining the purity of the function. If we were to
call <code class="language-plaintext highlighter-rouge">calculate5 0</code> we would get the <code class="language-plaintext highlighter-rouge">Left</code> instance while any other call would
return our <code class="language-plaintext highlighter-rouge">Right</code> result.</p>

<h2 id="end">End</h2>

<p>That’s it for now, hope you enjoyed it. Do you have any other nifty
<code class="language-plaintext highlighter-rouge">Applicative</code> tricks. Message me on <strong>Twitter</strong>.</p>

<p>Until next time!</p>]]></content><author><name></name></author><category term="haskell" /><summary type="html"><![CDATA[Either is the Prelude provided type that allows us to work with functions that can return either one result or another.]]></summary></entry><entry><title type="html">Haskell: State and StateT examples.</title><link href="https://cstml.github.io/2021/07/22/State-Monad.html" rel="alternate" type="text/html" title="Haskell: State and StateT examples." /><published>2021-07-22T00:00:00+00:00</published><updated>2021-07-22T00:00:00+00:00</updated><id>https://cstml.github.io/2021/07/22/State-Monad</id><content type="html" xml:base="https://cstml.github.io/2021/07/22/State-Monad.html"><![CDATA[<blockquote>
  <p>A look at the State Monad and StateT Monad Transformer.</p>
</blockquote>

<p>Beginning to work with Monads is an important aspect of learning to work with
Haskell. I wanted to add my take on some simple examples to try and add to the
existing ones. So let’s have a look.</p>

<h2 id="lets-say">Let’s say</h2>

<p>We have a web app and we need to monitor if a user is logged in or not across
our session, and each of our functions return a result.</p>

<h2 id="the-code">The code</h2>

<p>Firstly we need to import our monad libraries. For this example we will be using:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">import</span> <span class="nn">Control.Monad.IO.Class</span> <span class="p">(</span><span class="nf">liftIO</span><span class="p">)</span>  <span class="c1">-- ^ liftIO allows us to lift the output</span>
                                        <span class="c1">-- out of the monad and for example</span>
                                        <span class="c1">-- print or read, just like normal IO.</span>

<span class="kr">import</span> <span class="nn">Control.Monad.Trans.State</span>        <span class="c1">-- ^ the bog standard State Monad,</span>
                                        <span class="c1">-- together with the StateT Monad</span>
                                        <span class="c1">-- Transformer, which allows us to</span>
                                        <span class="c1">-- enrich the IO monad with the</span>
                                        <span class="c1">-- capabilities of State monad.</span>
</code></pre></div></div>

<p>OK, I will try and comment the text as I go along, but so far so good. Let’s now
define our two data types that we will use, based on the above web app
assumptions.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">WebsiteResult</span> <span class="o">=</span> <span class="kt">OK</span> <span class="o">|</span> <span class="kt">Err</span> <span class="kt">String</span>       <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Eq</span><span class="p">)</span>
<span class="kr">data</span> <span class="kt">WebsiteState</span> <span class="o">=</span> <span class="kt">LoggedIn</span> <span class="o">|</span> <span class="kt">LoggedOut</span>   <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span><span class="kt">Eq</span><span class="p">)</span>
</code></pre></div></div>

<p>So we know that the Website can return an <code class="language-plaintext highlighter-rouge">OK</code> or an <code class="language-plaintext highlighter-rouge">Err + String information</code>
and all the state we want to track is if we are <code class="language-plaintext highlighter-rouge">LoggedIn</code> or <code class="language-plaintext highlighter-rouge">LoggedOut</code>. I
hope this is all good until now. Let’s now have a look at defining an operation.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">exOperation</span> <span class="o">::</span> <span class="kt">State</span> <span class="kt">WebsiteState</span> <span class="kt">WebsiteResult</span>
<span class="n">exOperation</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="n">logIn</span> <span class="s">"Password"</span>
  <span class="n">makeTransaction</span>
  <span class="n">printResult</span>
</code></pre></div></div>

<p>Arguably you can read what the <code class="language-plaintext highlighter-rouge">exOperation</code> does - without seeing the actual
implementation (to which we will get to) of the operations. It first tries to
login by providing a string <code class="language-plaintext highlighter-rouge">"Password"</code>, then it attempts to make a
transaction, and at the end it prints out the result. We can agree this is very
neat. Furthermore if we look at the type of <code class="language-plaintext highlighter-rouge">exOperation</code> we can already get an
insight into what it tells us. We read it as: <em>we are operating with a State
monad that is holding an instance of WebsiteState and at the end we are
returning a WebsiteResult.</em></p>

<p>OK now let’s have a look at how we would go about implementing these operations.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">logIn</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">State</span> <span class="kt">WebsiteState</span> <span class="kt">WebsiteResult</span>
<span class="n">logIn</span> <span class="n">password</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="kr">if</span> <span class="n">password</span> <span class="o">==</span> <span class="s">"Password"</span>  <span class="c1">-- | check if it is the password </span>
    <span class="kr">then</span> <span class="n">put</span> <span class="kt">LoggedIn</span>        <span class="c1">-- | logged in</span>
    <span class="kr">else</span> <span class="n">put</span> <span class="kt">LoggedOut</span>       <span class="c1">-- | logged out</span>
  <span class="n">checkOk</span>                    <span class="c1">-- | at the end we check to see what happened</span>

    <span class="kr">where</span>
      <span class="n">checkOk</span> <span class="o">::</span> <span class="kt">State</span> <span class="kt">WebsiteState</span> <span class="kt">WebsiteResult</span>
      <span class="n">checkOk</span> <span class="o">=</span> <span class="kr">do</span>
        <span class="n">state</span> <span class="o">&lt;-</span> <span class="n">get</span>
        <span class="kr">if</span> <span class="n">state</span> <span class="o">==</span> <span class="kt">LoggedIn</span> <span class="kr">then</span> <span class="n">return</span> <span class="kt">OK</span> <span class="kr">else</span> <span class="n">return</span> <span class="o">$</span> <span class="kt">Err</span> <span class="s">"Bad Log In"</span>
</code></pre></div></div>

<p>The first one takes a String, compares it to the (albeit hard-coded here) correct
password. If it likes it, it changes the state to <code class="language-plaintext highlighter-rouge">LoggedIn</code> by using the <code class="language-plaintext highlighter-rouge">put</code>
function. If it doesn’t then it changes it to <code class="language-plaintext highlighter-rouge">LoggedOut</code>. At the end I provided
one more monad instance to show how we would change the return. In it we use the
other useful function for the <code class="language-plaintext highlighter-rouge">State</code> monad, namely <code class="language-plaintext highlighter-rouge">get</code> which gets the
<code class="language-plaintext highlighter-rouge">WebsiteState</code> out of the monad. Hopefully you are starting to get the gist of
it, if not let’s look further at the other two functions:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">makeTransaction</span> <span class="o">::</span> <span class="kt">State</span> <span class="kt">WebsiteState</span> <span class="kt">Bool</span>
<span class="n">makeTransaction</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="n">state</span> <span class="o">&lt;-</span> <span class="n">get</span>
  <span class="kr">case</span> <span class="n">state</span> <span class="kr">of</span>
    <span class="kt">LoggedIn</span> <span class="o">-&gt;</span> <span class="n">return</span> <span class="kt">True</span>
    <span class="kt">LoggedOut</span> <span class="o">-&gt;</span> <span class="n">return</span> <span class="kt">False</span>

<span class="n">printResult</span> <span class="o">::</span> <span class="kt">State</span> <span class="kt">WebsiteState</span> <span class="kt">WebsiteResult</span>
<span class="n">printResult</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="n">state</span> <span class="o">&lt;-</span> <span class="n">get</span>
  <span class="kr">case</span> <span class="n">state</span> <span class="kr">of</span>
    <span class="kt">LoggedIn</span> <span class="o">-&gt;</span> <span class="n">pure</span> <span class="o">$</span> <span class="kt">OK</span>
    <span class="kt">LoggedOut</span> <span class="o">-&gt;</span> <span class="n">pure</span> <span class="o">$</span> <span class="kt">Err</span> <span class="s">"Hi, enter your good password!"</span>
</code></pre></div></div>

<p>These are mostly identical with the exception of one thing, namely the use of
<code class="language-plaintext highlighter-rouge">pure</code> instead of <code class="language-plaintext highlighter-rouge">return</code>. It’s worth keeping in mind that both are identical,
and it’s mostly to do with defining <code class="language-plaintext highlighter-rouge">Applicative Functor</code>.</p>

<h2 id="running-the-monad">Running the Monad</h2>

<p>OK so all good, but how do we get the result of running the <code class="language-plaintext highlighter-rouge">exOperation</code> monad?
Well to do this we need to use <code class="language-plaintext highlighter-rouge">runState :: State s a -&gt; s -&gt; (a, s)</code> which (as
its type suggests) takes a State Monad and an initial State and returns the
result of the calculation as a tuple of state and result. Perfect so let’s do it.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">result</span> <span class="o">=</span> <span class="n">runState</span> <span class="n">exOperation</span> <span class="kt">LoggedOut</span> <span class="c1">-- will return (OK,LoggedIn)</span>
</code></pre></div></div>

<p>And if we wanted to get the result only and print it we could simply feed this
to a <code class="language-plaintext highlighter-rouge">fst</code> in a <code class="language-plaintext highlighter-rouge">IO ()</code> monad.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">printOutResult</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="n">printOutResult</span> <span class="o">=</span> <span class="n">print</span> <span class="o">$</span> <span class="n">fst</span> <span class="n">result</span>
</code></pre></div></div>

<h1 id="but-what-if-">But what if …</h1>
<p>But what if we wanted to print out results as we went along, would that be
possible? The answer is yes, but that means that we would need access to an <code class="language-plaintext highlighter-rouge">IO</code>
monad instance while we are inside the <code class="language-plaintext highlighter-rouge">State</code> monad, which still behaves as we
would expect <code class="language-plaintext highlighter-rouge">IO</code> to behave. This is exactly what <code class="language-plaintext highlighter-rouge">StateT</code> monad is for. Where
<code class="language-plaintext highlighter-rouge">State</code> would have to have a signature of the type <code class="language-plaintext highlighter-rouge">State Type1 (IO Type2)</code> we
can see from the signature that we don’t have (easy) access to <code class="language-plaintext highlighter-rouge">Type2</code> - as it
is wrapped inside the <code class="language-plaintext highlighter-rouge">IO</code> and we cannot reach inside to grab it. <code class="language-plaintext highlighter-rouge">StateT</code>
allows us to make use of a type looking like <code class="language-plaintext highlighter-rouge">StateT Type1 IO Type2</code> - hence now
we can make use of both the <code class="language-plaintext highlighter-rouge">State</code> functions and the <code class="language-plaintext highlighter-rouge">IO</code> capabilities. Let’s
look at the example, which I have annotated to make it easier to follow along.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">--  If we wanted to combine this behaviour with an IO Monad we would need to use</span>
<span class="c1">--  the StateT transformer.</span>

<span class="n">operations</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="n">operations</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="n">putStrLn</span> <span class="s">"Hello and Welcome to our Operations.</span><span class="se">\n</span><span class="s"> Please insert your password:"</span>
  <span class="n">pass</span>             <span class="o">&lt;-</span> <span class="n">getLine</span>
  <span class="kr">let</span> <span class="n">computation</span>  <span class="o">=</span> <span class="n">logInT</span> <span class="n">pass</span>
  <span class="kr">let</span> <span class="n">initialState</span> <span class="o">=</span> <span class="kt">LoggedOut</span>
  <span class="n">result</span>           <span class="o">&lt;-</span> <span class="n">runStateT</span> <span class="n">computation</span> <span class="n">initialState</span>
  <span class="n">return</span> <span class="nb">()</span>

<span class="cd">-- | Observe how our return actually returns inside the IO Monad but our state</span>
<span class="c1">-- is outside of it. This offers us more control than something like "State</span>
<span class="c1">-- WebsiteState (IO WebsiteResult)" because we get a shallower version of the</span>
<span class="c1">-- monad, and we also get access to the </span>

<span class="n">logInT</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">StateT</span> <span class="kt">WebsiteState</span> <span class="kt">IO</span> <span class="kt">WebsiteResult</span>
<span class="n">logInT</span> <span class="n">password</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="c1">-- | First thing we get the state</span>
  <span class="n">state</span> <span class="o">&lt;-</span> <span class="n">get</span>
  <span class="c1">-- | Then, we check if we are already logged in.</span>
  <span class="kr">if</span> <span class="n">state</span> <span class="o">==</span> <span class="kt">LoggedIn</span>
    <span class="kr">then</span> <span class="n">liftIO</span> <span class="o">$</span> <span class="n">print</span> <span class="s">"Allready Logged In!"</span>
    <span class="kr">else</span> <span class="n">liftIO</span> <span class="o">$</span> <span class="n">print</span> <span class="s">"You need to sign in"</span>
  <span class="c1">-- | Now we get to check the password.</span>
  <span class="kr">if</span> <span class="n">password</span> <span class="o">==</span> <span class="s">"Password"</span>           
    <span class="kr">then</span> <span class="n">put</span> <span class="kt">LoggedIn</span>                 
    <span class="kr">else</span> <span class="n">put</span> <span class="kt">LoggedOut</span>
  <span class="c1">-- | In the end we get the state again to check if the log in was successful.</span>
  <span class="n">state</span> <span class="o">&lt;-</span> <span class="n">get</span>
  <span class="kr">case</span> <span class="n">state</span> <span class="kr">of</span>
    <span class="kt">LoggedIn</span> <span class="o">-&gt;</span> <span class="n">liftIO</span> <span class="o">$</span> <span class="n">print</span> <span class="s">"Correct Password! Welcome!"</span>
    <span class="kr">_</span> <span class="o">-&gt;</span> <span class="n">liftIO</span> <span class="o">$</span> <span class="n">print</span> <span class="s">"Bad Password. Denied."</span>
  <span class="c1">-- | And at the end end we just return a random Auth Code.</span>
  <span class="n">return</span> <span class="kt">OK</span>
</code></pre></div></div>

<p>Worth noting here is that we could have just used <code class="language-plaintext highlighter-rouge">return</code> or <code class="language-plaintext highlighter-rouge">pure</code> to lift the
<code class="language-plaintext highlighter-rouge">IO</code> operation, but the issue here is that it will not print or read it (best
way to understand this would be to try it yourself), hence we need to use
<code class="language-plaintext highlighter-rouge">liftIO</code> - this way we make sure that the <code class="language-plaintext highlighter-rouge">IO</code> operations happen as expected.</p>

<h2 id="in-the-end">In the end</h2>

<p>Hopefully this example helps you use <code class="language-plaintext highlighter-rouge">State</code> and <code class="language-plaintext highlighter-rouge">StateT</code> and gives a bit more
insight.</p>

<h1 id="other-resources">Other Resources</h1>
<ul>
  <li><a href="https://wiki.haskell.org/Simple_StateT_use">Simple StateT use</a></li>
  <li><a href="https://wiki.haskell.org/State_Monad">State Monad</a></li>
</ul>]]></content><author><name></name></author><category term="haskell" /><summary type="html"><![CDATA[A look at the State Monad and StateT Monad Transformer.]]></summary></entry><entry><title type="html">Haskell: Applicative</title><link href="https://cstml.github.io/2021/05/23/applicative.html" rel="alternate" type="text/html" title="Haskell: Applicative" /><published>2021-05-23T00:00:00+00:00</published><updated>2021-05-23T00:00:00+00:00</updated><id>https://cstml.github.io/2021/05/23/applicative</id><content type="html" xml:base="https://cstml.github.io/2021/05/23/applicative.html"><![CDATA[<blockquote>
  <p>Or how to do the same thing with a different approach.</p>
</blockquote>

<h2 id="and-a-bit-of-traversable">And a bit of Traversable</h2>
<p><em>updated 2021-05-25</em></p>
<ul>
  <li><a href="https://hackage.haskell.org/package/base-4.15.0.0/docs/Control-Applicative.html">Hackage Applicative Documentation</a></li>
  <li><a href="https://hackage.haskell.org/package/base-4.15.0.0/docs/Data-Traversable.html">Hackage Traversable Documentation</a></li>
</ul>

<h2 id="what-are-they">What are they?</h2>

<h3 id="applicative"><code class="language-plaintext highlighter-rouge">Applicative</code></h3>

<ul>
  <li>
    <p>An <code class="language-plaintext highlighter-rouge">Applicative</code> is short for a <em>strong lax monoidal functor</em> or some people might call it an <em>Applicative Functor</em>.</p>
  </li>
  <li>
    <p>In Haskell - it is a <strong>Functor</strong> that comes with an operation <code class="language-plaintext highlighter-rouge">&lt;*&gt; :: f (a -&gt; b) -&gt; f a -&gt; f b</code> that tells it how to <strong>Apply</strong> a higher level <code class="language-plaintext highlighter-rouge">Functor</code> to another <code class="language-plaintext highlighter-rouge">Functor</code>.</p>
  </li>
  <li>
    <p>If you remember from the <a href="https://cstml.github.io/2021/05/03/haskell-functor.html"><code class="language-plaintext highlighter-rouge">Functor</code></a> article, we already defined what a <code class="language-plaintext highlighter-rouge">Functor</code> is and what <code class="language-plaintext highlighter-rouge">fmap</code> (aka. <code class="language-plaintext highlighter-rouge">&lt;$&gt;</code>) does - let’s compare them side by side:</p>
  </li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&lt;?&gt;</span> <span class="o">::</span>   <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
<span class="o">&lt;*&gt;</span> <span class="o">::</span> <span class="n">f</span> <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</code></pre></div></div>

<ul>
  <li>
    <p>In essence the difference is that with <code class="language-plaintext highlighter-rouge">&lt;$&gt;</code> the function is <em>flat</em> - i.e. outside the realms of the <code class="language-plaintext highlighter-rouge">Functor</code> and it is injected inside.</p>
  </li>
  <li>
    <p>In <code class="language-plaintext highlighter-rouge">&lt;*&gt;</code> ( a.k.a. <em>“splat”</em> - as I have just found out during an interview earlier this week) the first argument is a <strong>lifted</strong> function - i.e. the <code class="language-plaintext highlighter-rouge">Functor</code> contains a higher order type.</p>
  </li>
</ul>

<hr />

<ul>
  <li>for Haskell to believe you a type is an instance of an <code class="language-plaintext highlighter-rouge">Applicative</code> it is sufficient to prove it has the functions:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">pure</code> of type <code class="language-plaintext highlighter-rouge">Applicative f =&gt; a -&gt; f a</code>, and</li>
      <li>either:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">&lt;*&gt;</code> of type <code class="language-plaintext highlighter-rouge">Applicative f =&gt; f (a -&gt; b) -&gt; f a -&gt; f b</code>, or</li>
          <li><code class="language-plaintext highlighter-rouge">liftA2</code> of type <code class="language-plaintext highlighter-rouge">Applicative f =&gt; (a -&gt; b -&gt; c) -&gt; f a -&gt; f b -&gt; f c</code>.</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Other laws that it must satisfy:
    <ul>
      <li><em>Identity</em> <code class="language-plaintext highlighter-rouge">pure id &lt;*&gt; v = v</code></li>
      <li><em>Composition</em> <code class="language-plaintext highlighter-rouge">pure (.) &lt;*&gt; u &lt;*&gt; v &lt;*&gt; w = u &lt;*&gt; (v &lt;*&gt; w)</code></li>
      <li><em>Homomorphism</em> <code class="language-plaintext highlighter-rouge">pure f &lt;*&gt; pure x = pure (f x)</code></li>
      <li><em>Interchange</em> <code class="language-plaintext highlighter-rouge">u &lt;*&gt; pure y = pure ($ y) &lt;*&gt; u</code>
        <ul>
          <li>For the whole list with further conversation it would be good to consult <a href="https://hackage.haskell.org/package/base-4.15.0.0/docs/Prelude.html#t:Applicative">hackage</a>.</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="scenario">Scenario</h2>

<p>Lets say we want to have a type <code class="language-plaintext highlighter-rouge">Doer</code> that stores both a type and its <strong>meta sign</strong>- <em>which is a property we came up with</em>.</p>

<p>The meta sign has the following behaviour: when we do operations with these type, the signs interact and the resulting sign follow the normal sign rule i.e. :</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">+ &amp; +</code> = <code class="language-plaintext highlighter-rouge">+</code>,</li>
  <li><code class="language-plaintext highlighter-rouge">+ &amp; -</code> = <code class="language-plaintext highlighter-rouge">-</code>,</li>
  <li><code class="language-plaintext highlighter-rouge">- &amp; +</code> = <code class="language-plaintext highlighter-rouge">-</code>,</li>
  <li><code class="language-plaintext highlighter-rouge">- &amp; -</code> = <code class="language-plaintext highlighter-rouge">+</code>.</li>
</ul>

<p><em>I would also like to introduce the use of <code class="language-plaintext highlighter-rouge">GADTs</code> in this case, as it makes working with the type nicer. Note that this could have been done without it, but I thought it would be clearer what we are doing by using them.</em></p>

<hr />
<h2 id="implementation">Implementation</h2>

<ul>
  <li>As mentioned before lets enable <code class="language-plaintext highlighter-rouge">GADTs</code>, and also let’s import the <code class="language-plaintext highlighter-rouge">Applicative</code> module</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">{-# LANGUAGE GADTs #-}</span>
<span class="kr">import</span> <span class="nn">Control.Applicative</span>
</code></pre></div></div>

<hr />

<ul>
  <li>And continue by defining our types. Let us define the type <code class="language-plaintext highlighter-rouge">Op</code> which is our <strong>meta sign</strong>. We also implement a <code class="language-plaintext highlighter-rouge">Show</code> so we can display it nicely.</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Op</span> <span class="o">=</span> <span class="kt">Add</span> <span class="o">|</span> <span class="kt">Sub</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Eq</span><span class="p">)</span>

<span class="kr">instance</span> <span class="kt">Show</span> <span class="kt">Op</span> <span class="kr">where</span>
  <span class="n">show</span> <span class="n">o</span> <span class="o">=</span> <span class="kr">if</span> <span class="n">o</span> <span class="o">==</span> <span class="kt">Add</span> <span class="kr">then</span> <span class="s">"+"</span> <span class="kr">else</span> <span class="s">"-"</span>
</code></pre></div></div>

<hr />

<ul>
  <li>Now we can define our sign rule function that combines the two <code class="language-plaintext highlighter-rouge">Op</code>s.</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">signRule</span> <span class="o">::</span> <span class="kt">Op</span> <span class="o">-&gt;</span> <span class="kt">Op</span> <span class="o">-&gt;</span> <span class="kt">Op</span>
<span class="n">signRule</span> <span class="n">x</span> <span class="n">y</span>
  <span class="o">=</span> <span class="kr">case</span> <span class="n">x</span> <span class="kr">of</span>
      <span class="kt">Add</span> <span class="o">-&gt;</span> <span class="kr">case</span> <span class="n">y</span> <span class="kr">of</span>
                <span class="kt">Add</span> <span class="o">-&gt;</span> <span class="kt">Add</span>
                <span class="kt">Sub</span> <span class="o">-&gt;</span> <span class="kt">Sub</span>
      <span class="kt">Sub</span> <span class="o">-&gt;</span> <span class="kr">case</span> <span class="n">y</span> <span class="kr">of</span>
                <span class="kt">Add</span> <span class="o">-&gt;</span> <span class="kt">Sub</span>
                <span class="kt">Sub</span> <span class="o">-&gt;</span> <span class="kt">Add</span>
</code></pre></div></div>

<ul>
  <li>But if we look, we can see a pattern - <code class="language-plaintext highlighter-rouge">Op</code> is a <code class="language-plaintext highlighter-rouge">monoid</code> where <code class="language-plaintext highlighter-rouge">Add</code> is the neutral element. So let’s make use of this and also enrich our type with another of its <em>inherent - discovered</em> properties.</li>
  <li><em>Note: algebraic properties are discovered and not designed - they are inherent to the type itself. You can design your types to make use of types that have the properties or not - but you cannot design the property into a type - if it doesn’t have it.</em></li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">instance</span> <span class="kt">Semigroup</span> <span class="kt">Op</span> <span class="kr">where</span>
  <span class="p">(</span><span class="o">&lt;&gt;</span><span class="p">)</span> <span class="o">=</span> <span class="n">signRule</span>

<span class="kr">instance</span> <span class="kt">Monoid</span> <span class="kt">Op</span> <span class="kr">where</span>
  <span class="n">mempty</span> <span class="o">=</span> <span class="kt">Add</span> 
</code></pre></div></div>

<hr />

<ul>
  <li>Next let’s define our type <code class="language-plaintext highlighter-rouge">Doer</code>. In this implementation, our type constructor <code class="language-plaintext highlighter-rouge">ON</code> takes a meta sign <code class="language-plaintext highlighter-rouge">Op</code> and any type <code class="language-plaintext highlighter-rouge">a</code> and it creates an instance of <code class="language-plaintext highlighter-rouge">Doer a</code> - think of it like an embellished type that contains our meta-sign.</li>
</ul>

<pre><code class="language-Haskell">data Doer a where
  ON :: Op -&gt; a -&gt; Doer a
  deriving (Show, Eq)
</code></pre>

<hr />

<ul>
  <li>And let’s look at a few examples that would make it clear</li>
</ul>

<pre><code class="language-Haskell">ex0 =  ON Sub 3            -- ON - 3
ex1 =  ON Add "Hello"      -- ON + "Hello"
ex2 = [ON Sub 3, ON Add 2] -- [ON - 3,ON + 2]
</code></pre>

<p>We can see that <code class="language-plaintext highlighter-rouge">Doer a</code> is a <code class="language-plaintext highlighter-rouge">Functor</code>. Let’s prove it.</p>

<pre><code class="language-Haskell">instance Functor Doer where
  fmap f (ON o x) = ON o $ f x
</code></pre>

<p>Now, let’s prove it is an <code class="language-plaintext highlighter-rouge">Applicative</code>.</p>

<pre><code class="language-Haskell">instance Applicative Doer where
  pure                      = ON (mempty::Op)
  (&lt;*&gt;) (ON o f) (ON o' n') = ON (o &lt;&gt; o') (f $ n')
</code></pre>

<p>Note: we made use in <code class="language-plaintext highlighter-rouge">(o &lt;&gt; o')</code> of our previously <em>discovered</em> <code class="language-plaintext highlighter-rouge">Monoid</code> property. The reader (yes, you) can check that the rest of the laws of the <code class="language-plaintext highlighter-rouge">Applicative Functor</code> stand.</p>

<hr />

<h4 id="examples">Examples</h4>

<ul>
  <li>OK I’m glad to say that we’ve covered most of the info regarding <code class="language-plaintext highlighter-rouge">Applicative</code>, some examples to see it in action would be good.</li>
</ul>

<hr />

<h4 id="example-1">Example 1:</h4>

<p>Let’s use our <em>splat</em> to apply the lifted function <code class="language-plaintext highlighter-rouge">(+1)</code> to a functor:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex01</span> <span class="o">=</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">1</span> <span class="c1">-- ON + 2</span>
<span class="c1">--   = ON - (+1) &lt;*&gt; ON - 1     -- this is what happens</span>
<span class="c1">--   = ON ( - &lt;&gt; - ) (1 $ (+1))</span>
<span class="c1">--   = ON + 2</span>
</code></pre></div></div>
<p>So it works as intended, we have the result of the operation and the result of the interaction between their meta signs.</p>

<hr />
<h4 id="example-2">Example 2:</h4>

<p>We want to compose two functions and apply them to a <code class="language-plaintext highlighter-rouge">Functor</code></p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex02</span> <span class="o">=</span> <span class="n">pure</span> <span class="p">((</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span> <span class="p">(</span><span class="o">+</span><span class="mi">2</span><span class="p">))</span> <span class="o">&lt;*&gt;</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span> <span class="c1">-- ON - 6</span>
</code></pre></div></div>

<p>Is there another way to write this? Of course, and it might give some insight into what actually happens:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex03</span> <span class="o">=</span> <span class="n">pure</span> <span class="p">(</span><span class="o">.</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="n">pure</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="n">pure</span> <span class="p">(</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span> <span class="c1">-- ON - 6</span>
</code></pre></div></div>

<p>Explanation: we lift the composition, we partially apply it to the lifted <code class="language-plaintext highlighter-rouge">(+1)</code> we then apply it to the lifted <code class="language-plaintext highlighter-rouge">(+2)</code> giving us the lifted composition of <code class="language-plaintext highlighter-rouge">(+1)</code> and <code class="language-plaintext highlighter-rouge">(+2)</code>. Then in the end we apply this to lifted <code class="language-plaintext highlighter-rouge">3</code> and we get lifted <code class="language-plaintext highlighter-rouge">6</code>. As the functions are pure our meta sign is not altered.</p>

<hr />

<h4 id="example-3">Example 3:</h4>

<p>We want to do the previous while changing our meta sign accordingly.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex04</span> <span class="o">=</span> <span class="n">pure</span> <span class="p">(</span><span class="o">.</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="kt">ON</span> <span class="kt">Add</span> <span class="p">(</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span> <span class="c1">-- ON + 6</span>
</code></pre></div></div>

<p>Isn’t that fantastic:</p>
<ul>
  <li>we already know that <code class="language-plaintext highlighter-rouge">6</code> is the result of the function application</li>
  <li><code class="language-plaintext highlighter-rouge">- + - </code> = <code class="language-plaintext highlighter-rouge">+</code> - which gets through to us in the type.</li>
</ul>

<hr />

<h4 id="example-4">Example 4:</h4>

<p>Say we have a list of <code class="language-plaintext highlighter-rouge">Doer</code>s and a higher typed <code class="language-plaintext highlighter-rouge">Doer</code> and we want to <code class="language-plaintext highlighter-rouge">fmap</code> it.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex2</span>  <span class="o">=</span> <span class="p">[</span><span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span><span class="p">,</span> <span class="kt">ON</span> <span class="kt">Add</span> <span class="mi">2</span><span class="p">]</span>
<span class="n">ex05</span> <span class="o">=</span> <span class="p">(</span><span class="n">pure</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;*&gt;</span><span class="p">)</span> <span class="o">&lt;$&gt;</span> <span class="n">ex2</span>    <span class="c1">-- [ON - 4,ON + 3]</span>
</code></pre></div></div>
<p>This is interesting - we can observe here what is going on - if we refactor again with something that we’ve seen before:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex05'</span> <span class="o">=</span> <span class="p">(</span><span class="n">fmap</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="o">&lt;$&gt;</span>  <span class="n">ex2</span>    <span class="c1">-- [ON - 4,ON + 3]</span>
<span class="n">ex05''</span><span class="o">=</span> <span class="n">fmap</span> <span class="p">(</span><span class="n">fmap</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="n">ex2</span>    <span class="c1">-- [ON - 4,ON + 3]</span>
</code></pre></div></div>

<p>This behaviour is linked to the definition of <code class="language-plaintext highlighter-rouge">pure</code>. But the added benefit of being able to interact through <code class="language-plaintext highlighter-rouge">&lt;*&gt;</code> is that it easily allows us to change the meta-sign.</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex06</span> <span class="o">=</span> <span class="p">((</span><span class="kt">ON</span> <span class="kt">Sub</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="o">&lt;*&gt;</span> <span class="p">)</span> <span class="o">&lt;$&gt;</span> <span class="n">ex2</span>  <span class="c1">-- [ON + 4,ON - 3]</span>
</code></pre></div></div>
<p>Observe how in <code class="language-plaintext highlighter-rouge">ex06</code> the meta signs have flipped.</p>

<hr />
<h2 id="traversable-time">Traversable Time</h2>

<h3 id="what-is-it-">What is it ?</h3>

<ul>
  <li>
    <p>It is a <code class="language-plaintext highlighter-rouge">typeclass</code> that can be traversed from left to right - but its uses are a bit more subtle than that - and we’ll talk a bit more about it when time comes.</p>
  </li>
  <li>
    <p>I’m not going to go very in depth with regards to <code class="language-plaintext highlighter-rouge">Traversable</code>, because the post would fork too much (I will make a dedicated post at some point) - but it’s important to note that <code class="language-plaintext highlighter-rouge">Traversable</code>, <code class="language-plaintext highlighter-rouge">Applicatives</code>, <code class="language-plaintext highlighter-rouge">Monads</code> are very tightly connected. (The wiki article is a good read)</p>
  </li>
  <li>
    <p>Note: in the examples the <code class="language-plaintext highlighter-rouge">Traversable, Foldable t</code> is the <code class="language-plaintext highlighter-rouge">[]</code> type.</p>
  </li>
</ul>

<h3 id="examples-1">Examples</h3>
<ul>
  <li>Example: say we take a list of <code class="language-plaintext highlighter-rouge">Doer</code>s and we want to nest it into a <code class="language-plaintext highlighter-rouge">Doer</code> type itself, with the correct meta-sign (the sign of folding all the meta signs inside the list with the <code class="language-plaintext highlighter-rouge">&lt;&gt;</code> we defined) while in essence unwrapping the elements. The type of this function would look something like:</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">squishSign</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Doer</span> <span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Doer</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span>
</code></pre></div></div>

<p>So here are the challenges we are facing:</p>
<ul>
  <li>if we <code class="language-plaintext highlighter-rouge">foldMap :: Monoid m =&gt; (a -&gt; m) -&gt; t a -&gt; m</code> we need to do quite a bit of work to to get our <code class="language-plaintext highlighter-rouge">Doer</code> to match that type - not ideal - and we are lazy.</li>
  <li>Wouldn’t it be nice if we had some sort of function that would traverse our list, do something with the type and then at the end gives us that something? Don’t worry Haskell has our back:</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sequenceA</span> <span class="o">::</span> <span class="p">(</span><span class="kt">Traversable</span> <span class="n">t</span><span class="p">,</span> <span class="kt">Applicative</span> <span class="n">f</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="n">t</span> <span class="p">(</span><span class="n">f</span> <span class="n">a</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="n">t</span> <span class="n">a</span><span class="p">)</span>
</code></pre></div></div>

<ul>
  <li>observe how that <code class="language-plaintext highlighter-rouge">t</code> and <code class="language-plaintext highlighter-rouge">f</code> swap positions - that is what we want to do. We know <code class="language-plaintext highlighter-rouge">Doer</code> is <code class="language-plaintext highlighter-rouge">Applicative</code>, and we know that <code class="language-plaintext highlighter-rouge">[]</code> is <code class="language-plaintext highlighter-rouge">Traversable</code> so what are we waiting for:</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">squishSign</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Doer</span> <span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Doer</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span>
<span class="n">squishSign</span>  <span class="o">=</span> <span class="n">sequenceA</span> 
</code></pre></div></div>

<p>I wrote it as a section as it reads a bit better - but let’s see it in action:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex11</span> <span class="o">=</span> <span class="n">squishSign</span> <span class="p">[</span><span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span><span class="p">,</span> <span class="kt">ON</span> <span class="kt">Add</span> <span class="mi">2</span><span class="p">]</span>           <span class="c1">-- ON - [3,2]</span>
<span class="n">ex12</span> <span class="o">=</span> <span class="n">squishSign</span> <span class="p">[</span><span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span><span class="p">,</span> <span class="kt">ON</span> <span class="kt">Add</span> <span class="mi">2</span><span class="p">,</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span><span class="p">]</span> <span class="c1">-- ON + [3,2,3]</span>
</code></pre></div></div>

<p>Now we can apply some more functy (funky + functor) things we’ve seen earlier.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ex13</span> <span class="o">=</span> <span class="n">pure</span> <span class="n">sum</span> <span class="o">&lt;*&gt;</span> <span class="n">squishSign</span> <span class="p">[</span><span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span><span class="p">,</span> <span class="kt">ON</span> <span class="kt">Add</span> <span class="mi">2</span><span class="p">,</span> <span class="kt">ON</span> <span class="kt">Sub</span> <span class="mi">3</span><span class="p">]</span> <span class="c1">-- ON + [8]</span>
</code></pre></div></div>

<p>This has been a well long post, and we’ve had a lot of <em>functy</em> time together. What other cool <code class="language-plaintext highlighter-rouge">Applicative</code> and <code class="language-plaintext highlighter-rouge">Traversable</code> design patterns do you use or have discovered? Let me know!</p>

<h2 id="more-reading">More reading</h2>
<ul>
  <li><a href="https://en.wikibooks.org/wiki/Haskell/Traversable">Haskell Wiki Traversable</a></li>
</ul>]]></content><author><name></name></author><category term="haskell" /><summary type="html"><![CDATA[Or how to do the same thing with a different approach.]]></summary></entry><entry><title type="html">NIX: 2 Simple derivations</title><link href="https://cstml.github.io/2021/05/13/nix.html" rel="alternate" type="text/html" title="NIX: 2 Simple derivations" /><published>2021-05-13T00:00:00+00:00</published><updated>2021-05-13T00:00:00+00:00</updated><id>https://cstml.github.io/2021/05/13/nix</id><content type="html" xml:base="https://cstml.github.io/2021/05/13/nix.html"><![CDATA[<p>I’ve been using NixOS and I quite like it (a lot). When I installed it, I got
rid of my Debian and jumped head forwards with a full wipe out and clean
instal. To be honest, it wasn’t that bad, and I managed to install everything in
two attempts with around 1 hour of tweaking in the liveUSB version - but the
documentation was nice, clear and easy to follow.</p>

<p>To begin with, it took a while to get used to it, but worked it in and in the
end it turned out I really like it - and it works very well. So I thought that
it might be worth sharing a few steps and insights into making a simple standard
derivation.</p>

<h3 id="why-nixos">Why NixOS</h3>

<p>If you like declarative environments, changing your configurations, trying out
new software, reproducible builds, etc. then NixOS is for you. You can work,
configure, build, run programs in completely different environments and it is as
easy as writing a <code class="language-plaintext highlighter-rouge">nix</code> derivation.</p>

<h2 id="a-tale-of-two-derivations">A tale of two derivations</h2>

<p><em>What are we looking to do?</em></p>

<p>It’s important that we stick to the basics - let’s make two simple nix
derivations. The first one will produce a file with that says “Hello World!”
and the second derivation will use the first one and produce another file that
says a different message.</p>

<h2 id="from-null-to-nix---a-bit-about-the-nix-language">From \null To NIX - A bit about the NIX language</h2>

<h4 id="nix-functions">NIX Functions</h4>

<p><code class="language-plaintext highlighter-rouge">NIX</code> the package manager uses its own <strong>lazy, pure, functional language</strong> to
build derivations called <code class="language-plaintext highlighter-rouge">NIX</code> - and as you would expect <strong>functions</strong> play a
major role in both <code class="language-plaintext highlighter-rouge">NIX</code> the language and <code class="language-plaintext highlighter-rouge">NIX</code> the package manager.</p>

<p>*I recommend you try these out in a <code class="language-plaintext highlighter-rouge">nix repl</code> instance. So let’s have a look:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="nv">x</span> <span class="p">:</span> <span class="nv">x</span> <span class="o">*</span> <span class="mi">2</span>

<span class="nv">f</span> <span class="mi">2</span> <span class="c"># -&gt; 4</span>
</code></pre></div></div>

<p>As you can see, all the functions are actual annonymous functions that
can be bound to a variable. To have multiple arguments to a function
we need to <em>curry</em> it:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="nv">x</span> <span class="p">:</span> <span class="nv">y</span> <span class="p">:</span> <span class="nv">x</span> <span class="o">*</span> <span class="nv">y</span>

<span class="nv">f</span> <span class="mi">2</span> <span class="mi">3</span> <span class="c"># -&gt; 6</span>
</code></pre></div></div>

<h4 id="functions-that-take-sets">Functions that take sets</h4>

<p>A handy feature of <code class="language-plaintext highlighter-rouge">NIX</code> is the way it can manipulate and work with
sets. For example:</p>

<p>We right sets like this:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
  <span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
  <span class="nv">c</span> <span class="o">=</span> <span class="s2">"Text"</span><span class="p">;</span> <span class="p">}</span>
</code></pre></div></div>

<p>Note the use of <code class="language-plaintext highlighter-rouge">;</code> to distinguish between elements of the set. So a
function that works on a set would look like this:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="nv">s</span> <span class="p">:</span> <span class="nv">s</span><span class="o">.</span><span class="nv">a</span> <span class="o">*</span> <span class="nv">s</span><span class="o">.</span><span class="nv">b</span>

<span class="nv">f</span> <span class="p">{</span> <span class="nv">a</span><span class="o">=</span><span class="mi">2</span> <span class="p">;</span> <span class="nv">b</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span> <span class="p">}</span> <span class="c"># -&gt; 6</span>
</code></pre></div></div>

<p>And with a named set:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">b</span> <span class="o">=</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="nv">c</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="p">}</span>

<span class="nv">f</span> <span class="nv">b</span> <span class="c"># -&gt; 12</span>
</code></pre></div></div>

<p>Note that you can even explicitly grab these arguments from the set on
the left hand side of the expression like so: (careful with the fact
that when you destructure it on the right hand side it uses <code class="language-plaintext highlighter-rouge">,</code>
<em>always gets me</em>)</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="p">{</span><span class="nv">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">}</span> <span class="p">:</span> <span class="nv">a</span> <span class="o">*</span> <span class="nv">b</span>
</code></pre></div></div>

<p>Furthermore, <code class="language-plaintext highlighter-rouge">NIX</code> allows you to pass default arguments to your set
defined functions: (also note that even if the set has only one
element you still need to put the <code class="language-plaintext highlighter-rouge">;</code> - <em>also gets me every time</em>).</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">?</span> <span class="mi">1</span> <span class="p">,</span> <span class="nv">b</span> <span class="o">?</span> <span class="mi">2</span> <span class="p">}</span> <span class="p">:</span> <span class="nv">a</span> <span class="o">*</span> <span class="nv">b</span>

<span class="nv">f</span> <span class="p">{}</span>         <span class="c"># -&gt; 2</span>
<span class="nv">f</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="p">}</span> <span class="c"># -&gt; 4</span>
</code></pre></div></div>

<h6 id="set-union">Set Union</h6>

<p>By the way, you can merge sets using the infix operator <code class="language-plaintext highlighter-rouge">//</code>. As the
union of two overlapping elements the right hand side is maintained.</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;}</span> <span class="o">//</span> <span class="p">{</span><span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;}</span> <span class="c"># -&gt; { a = 1 ; b = 2; }</span>
<span class="p">{</span><span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;}</span> <span class="o">//</span> <span class="p">{</span><span class="nv">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;}</span> <span class="c"># -&gt; { a = 2 ; }</span>
</code></pre></div></div>

<h6 id="list-concatenation">List Concatenation</h6>

<p>List concatenation is your usual suspect. <code class="language-plaintext highlighter-rouge">++</code></p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span> <span class="mi">1</span> <span class="mi">2</span> <span class="p">]</span> <span class="o">++</span> <span class="p">[</span> <span class="mi">3</span> <span class="mi">4</span> <span class="p">]</span> 
</code></pre></div></div>

<h5 id="unexpected-attributes">Unexpected attributes</h5>

<p>A thing to note is that there is a difference in declaring the
variables of the set on the left or just declaring the set and
destructuring on the right. The differe is that when it is on the left
the function will not like it if you send it a set different to what
it expects.</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">?</span> <span class="mi">1</span> <span class="p">,</span> <span class="nv">b</span> <span class="o">?</span> <span class="mi">2</span> <span class="p">}</span> <span class="p">:</span> <span class="nv">a</span> <span class="o">*</span> <span class="nv">b</span>
<span class="nv">g</span> <span class="o">=</span> <span class="nv">s</span> <span class="p">:</span> <span class="nv">s</span><span class="o">.</span><span class="nv">a</span> <span class="o">*</span> <span class="nv">s</span><span class="o">.</span><span class="nv">b</span>

<span class="nv">f</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="nv">c</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;}</span> <span class="c"># -&gt; will not work! because it has a c </span>
<span class="nv">g</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="nv">c</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;}</span> <span class="c"># -&gt; will work</span>
</code></pre></div></div>

<p>To allow for more flexible sets in your function you need to add <code class="language-plaintext highlighter-rouge">...</code>
to its expected arguments</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">f</span> <span class="o">=</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">?</span> <span class="mi">1</span> <span class="p">,</span> <span class="nv">b</span> <span class="o">?</span> <span class="mi">2</span><span class="p">,</span> <span class="o">...</span> <span class="p">}</span> <span class="p">:</span> <span class="nv">a</span> <span class="o">*</span> <span class="nv">b</span>

<span class="nv">f</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="nv">c</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;}</span> <span class="c"># -&gt; 2 all good</span>
</code></pre></div></div>

<p>Also note that this way of writing it has the advantage of being able
to give the arguments default values. So all in all, pick your weapon
wisely.</p>

<p><strong>Note:</strong> <em>If you are like me and like static typing check out
<a href="https://github.com/dhall-lang/dhall-haskell/tree/master/dhall-nix">dhall</a>
is. I haven’t had the chance to use it much, but plan on doing so
soon.</em></p>

<h3 id="lazy-is-good">Lazy is good</h3>

<p>Bein Lazy, means that every <code class="language-plaintext highlighter-rouge">NIX</code> file is essentially a set of
expressions! So you can use <code class="language-plaintext highlighter-rouge">import</code> to import one file into another,
and <code class="language-plaintext highlighter-rouge">NIX</code> will essentially import the other file as a set - that’s
awesome. So for example:</p>

<p>File <code class="language-plaintext highlighter-rouge">a.nix</code>:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">2</span>
</code></pre></div></div>

<p>File <code class="language-plaintext highlighter-rouge">b.nix</code>:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="p">}</span>
</code></pre></div></div>

<p>File <code class="language-plaintext highlighter-rouge">f.nix</code>:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">s1</span> <span class="p">:</span> <span class="nv">s2</span> <span class="p">:</span> <span class="nv">s1</span> <span class="o">*</span> <span class="nv">s2</span><span class="o">.</span><span class="nv">b</span>
</code></pre></div></div>

<p>We can the open back up our <code class="language-plaintext highlighter-rouge">nix repl</code> and do the following:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">a</span> <span class="o">=</span> <span class="kr">import</span> <span class="sx">./a.nix</span>
<span class="nv">b</span> <span class="o">=</span> <span class="kr">import</span> <span class="sx">./b.nix</span>
<span class="nv">f</span> <span class="o">=</span> <span class="kr">import</span> <span class="sx">./f.nix</span>
<span class="nv">f</span> <span class="nv">a</span> <span class="nv">b</span>   <span class="c"># -&gt; 6</span>
</code></pre></div></div>

<p><em>That’s great if you ask me.</em></p>

<h3 id="with-let-in">With Let In</h3>

<p><code class="language-plaintext highlighter-rouge">Let</code> and <code class="language-plaintext highlighter-rouge">in</code> allows us to intorduce terms on the go, while <code class="language-plaintext highlighter-rouge">with</code>
allows us to avoid writing a lot.</p>

<p>The use of <code class="language-plaintext highlighter-rouge">with</code> makes a lot of sense when you realise that nested
expressions always have the <code class="language-plaintext highlighter-rouge">dot notation</code> - and it can become
tiresome. With gets rid of that by making all of the variables (while
avoiding clashses) of a term available to the other term. For example:</p>

<p>Instead of:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span>                         
  <span class="nv">context</span> <span class="o">=</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="p">};</span>
<span class="kn">in</span>
  <span class="nv">context</span><span class="o">.</span><span class="nv">a</span> <span class="o">+</span> <span class="nv">context</span><span class="o">.</span><span class="nv">b</span>
</code></pre></div></div>

<p>We can write:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span>                         
  <span class="nv">context</span> <span class="o">=</span> <span class="p">{</span> <span class="nv">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="p">};</span>
<span class="kn">in</span>
  <span class="kn">with</span> <span class="nv">context</span><span class="p">;</span> <span class="nv">a</span> <span class="o">+</span> <span class="nv">b</span>
</code></pre></div></div>

<h3 id="inherit">Inherit</h3>

<p>Inherit allows you to bring into the local scope, variables from
outside the scope. It sounds more complicated than it is but here’s an
example:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">a</span> <span class="o">=</span> <span class="mi">2</span>
<span class="nv">b</span> <span class="o">=</span> <span class="mi">3</span>
<span class="nv">c</span> <span class="o">=</span> <span class="p">{</span> <span class="kn">inherit</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">;</span> <span class="nv">c</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="p">}</span>

<span class="nv">c</span> <span class="c"># -&gt; { a = 2; b = 3; c = 4; } swoosh!</span>
</code></pre></div></div>

<h3 id="rec">Rec</h3>

<p>Rec turns a set into a set where self referencing is possible. It’s
handy as you can write out a sequence of lets and just grab one of
them:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">rec</span> <span class="p">{</span>
  <span class="nv">a</span> <span class="o">=</span> <span class="mi">1032</span> <span class="o">-</span> <span class="nv">b</span><span class="p">;</span>
  <span class="nv">b</span> <span class="o">=</span> <span class="mi">3213</span> <span class="o">-</span> <span class="nv">c</span><span class="p">;</span>
  <span class="nv">c</span> <span class="o">=</span> <span class="mi">222</span><span class="p">;</span>
  <span class="p">}</span><span class="o">.</span><span class="nv">a</span> <span class="c"># -&gt; -1959 which is the value of a</span>
</code></pre></div></div>

<h3 id="recursivity">Recursivity</h3>

<p>To make use of recursivity you need to declare your function with a <code class="language-plaintext highlighter-rouge">let</code></p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nv">f</span> <span class="o">=</span> <span class="nv">x</span> <span class="p">:</span> <span class="nv">y</span> <span class="p">:</span> <span class="k">if</span> <span class="p">(</span><span class="nv">y</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">then</span> <span class="nv">x</span> <span class="k">else</span> <span class="nv">f</span> <span class="p">(</span> <span class="nv">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">(</span> <span class="nv">y</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">);</span>
<span class="kn">in</span>  <span class="nv">f</span> <span class="mi">3</span> <span class="mi">4</span> <span class="c"># -&gt; 7</span>
</code></pre></div></div>
<p>Awesome.</p>

<h3 id="nix-types">NIX Types</h3>

<p>Although not statically typed, <code class="language-plaintext highlighter-rouge">NIX</code> is strongly typed. So the basic
types in <code class="language-plaintext highlighter-rouge">NIX</code> are:</p>

<table>
  <thead>
    <tr>
      <th><strong>Type</strong></th>
      <th><strong>Example</strong></th>
      <th><strong>Details</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Strings</td>
      <td><code class="language-plaintext highlighter-rouge">''Foooo''</code></td>
      <td><code class="language-plaintext highlighter-rouge">''</code> or <code class="language-plaintext highlighter-rouge">"</code></td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">"Bar"</code></td>
      <td> </td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Integer</td>
      <td><code class="language-plaintext highlighter-rouge">4</code></td>
      <td> </td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Floats</td>
      <td><code class="language-plaintext highlighter-rouge">2.2</code></td>
      <td> </td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Path</td>
      <td><code class="language-plaintext highlighter-rouge">./</code></td>
      <td>Relative paths get to be</td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">./.</code></td>
      <td>expanded to absolute paths</td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">&lt;nxpkgs/lib&gt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">&lt;nxpkgs&gt;</code> - goes to your</td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">NIX_PATH</code></td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>URI</td>
      <td>https://cstml.github.io/</td>
      <td> </td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Boolean</td>
      <td><code class="language-plaintext highlighter-rouge">true</code>,<code class="language-plaintext highlighter-rouge">false</code></td>
      <td> </td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Null</td>
      <td><code class="language-plaintext highlighter-rouge">null</code></td>
      <td> </td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Lists</td>
      <td>[1 2 3 “Bro mixing type” ]</td>
      <td>Spaces, not commas</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Set</td>
      <td>{ key = value; }</td>
      <td>Don’t forget the <code class="language-plaintext highlighter-rouge">;</code></td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Function</td>
      <td>x : x + 1</td>
      <td>Awesome with curry</td>
    </tr>
  </tbody>
</table>

<h3 id="nix-built-ins">Nix built ins</h3>

<p>Nix has LOADS of builtin functions, which I’m not going to go through,
but which you can easily discover by going into the <code class="language-plaintext highlighter-rouge">nix repl</code>, typing
<code class="language-plaintext highlighter-rouge">builtins.</code> and hitting <code class="language-plaintext highlighter-rouge">Tab</code>. If you are a <code class="language-plaintext highlighter-rouge">HaskellHead</code> or any sort
of <code class="language-plaintext highlighter-rouge">functional fan</code> you will see a lot of the usual suspects in there.</p>

<p>To learn what a function does, I sometimes do this thing where I type
the function and evaluate it without an argument and then it will give
some indication of what it is expecting. <em>Somehow, I still haven’t
found a great condensed easy to search resource for all the nix
functions, but this works great - REPLS are fantastic</em>.</p>

<p>Example</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">builtins</span><span class="o">.</span><span class="kr">derivation</span> <span class="mi">1</span>  <span class="c"># error: value is an integer </span>
                       <span class="c"># while a set was expected, at (string):1:1 - oh! Okay</span>
                       
<span class="kr">builtins</span><span class="o">.</span><span class="kr">derivation</span> <span class="p">{}</span> <span class="c"># error: required attribute 'name' missing, - ah, I see</span>

<span class="c"># ... - you catch my drift </span>
</code></pre></div></div>

<p>But even cooler nix gives us <code class="language-plaintext highlighter-rouge">builtins.derive.attrNames</code> which gives
us all the expceted attributes of a Set:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">builtins</span><span class="o">.</span><span class="nv">attrNames</span> <span class="p">(</span><span class="kr">builtins</span><span class="o">.</span><span class="kr">derivation</span> <span class="p">{})</span>
<span class="c"># -&gt;  [ "all" "drvAttrs" "drvPath" "out" "outPath" "outputName" "type" ]</span>
</code></pre></div></div>

<h4 id="further-reading">Further reading</h4>

<ul>
  <li><a href="https://nixos.wiki/wiki/Nix_Expression_Language">link</a></li>
</ul>

<hr />

<h2 id="the-first-derivation">The first derivation</h2>

<p>Ok, so it is very important to get to grips with the language (to a
good level) first I would say! Because afterwards you will se how nice
and neat working with NIX is.</p>

<h3 id="what-is-a-derivation">What is a derivation</h3>

<p>A derivation is a <code class="language-plaintext highlighter-rouge">NIX</code> pkg manager defined set (if you would
like). Every NIX derivation set must contain the following keys:</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">name</code> - the name of the derivation,</li>
  <li><code class="language-plaintext highlighter-rouge">system</code> - the filesystem in which it can be built,</li>
  <li><code class="language-plaintext highlighter-rouge">builder</code> - the binary program that builds the derivation</li>
</ol>

<p>Upon receiving a derivation, nix knows what to do with it. In essence
it evaluates it and does some funky stuff with hashes, so that way you
always get to save stuff in the right place. (<em>I quite like
cryptography and hashes and am unsure what the collision resistance of
the hashing algorithm really is, but I haven’t heard of any collisions
yet</em>)</p>

<p>Let’s create our greeter derivation</p>

<h4 id="derivation-1">Derivation 1</h4>

<p><code class="language-plaintext highlighter-rouge">greeter.nix</code>:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span>
  <span class="nv">pkgs</span>    <span class="o">?</span> <span class="kr">import</span> <span class="o">&lt;</span><span class="nv">nixpkgs</span><span class="o">&gt;</span><span class="p">{},</span>
  <span class="nv">message</span> <span class="o">?</span> <span class="s2">"Hello World!"</span><span class="p">,</span>
  <span class="nv">sayHi</span>   <span class="o">?</span> <span class="s2">'' echo '\n </span><span class="si">${</span><span class="nv">message</span><span class="si">}</span><span class="s2"> \n' \ &gt;&gt; $out ''</span><span class="p">,</span> 
  <span class="o">...</span>
<span class="p">}</span> <span class="p">:</span> <span class="kr">builtins</span><span class="o">.</span><span class="kr">derivation</span><span class="p">({</span>
  <span class="nv">name</span>    <span class="o">=</span> <span class="s2">"greeter"</span><span class="p">;</span>
  <span class="nv">system</span>  <span class="o">=</span> <span class="kr">builtins</span><span class="o">.</span><span class="nv">currentSystem</span><span class="p">;</span>
  <span class="nv">builder</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span><span class="nv">pkgs</span><span class="o">.</span><span class="nv">bash</span><span class="si">}</span><span class="s2">/bin/bash"</span><span class="p">;</span>
  <span class="nv">args</span>    <span class="o">=</span> <span class="p">[</span> <span class="s2">"-c"</span> <span class="nv">sayHi</span> <span class="p">];</span>
<span class="p">})</span>
</code></pre></div></div>

<p>Ok so what is the derivation actually? Well it is as we have seen from
the tutorial above a function that takes in a <strong>set</strong> and returns the
result of a derivation. In this case our function takes as parameters
<code class="language-plaintext highlighter-rouge">message</code> and <code class="language-plaintext highlighter-rouge">sayHi</code>. As previously discussed we use the <code class="language-plaintext highlighter-rouge">builitns</code>
functions to get the our current system and the builder is the
<code class="language-plaintext highlighter-rouge">nixpkgs.bash</code> - it doesn’t get any more basic than this really. To
<code class="language-plaintext highlighter-rouge">bash</code> we send first the argument <code class="language-plaintext highlighter-rouge">-c</code> which means execute the next
arguments as commands, and then we send it an the <code class="language-plaintext highlighter-rouge">sayHi</code> script from
the argument <code class="language-plaintext highlighter-rouge">Set</code>. If you look at the function you can see that we
are outputing to an environment variable specifically <code class="language-plaintext highlighter-rouge">$out</code>. This is
where <code class="language-plaintext highlighter-rouge">NIX</code> the package manager will save and store the output of our
build. After running <code class="language-plaintext highlighter-rouge">nix-build greeter.nix</code> you should have a
<code class="language-plaintext highlighter-rouge">result</code> symlink in your current folder that if you run <code class="language-plaintext highlighter-rouge">cat</code> on you
will see our message. Great!</p>

<h4 id="derivation-2">Derivation 2</h4>

<p>As we said from the beginning, we want <strong>derivation two</strong> to build
upon <code class="language-plaintext highlighter-rouge">greeter</code> and essentially do the same thing but with a different
message. This is where <code class="language-plaintext highlighter-rouge">NIX</code>’s elegance comes into play.</p>

<p><code class="language-plaintext highlighter-rouge">greeter2.nix</code></p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span>
  <span class="nv">g</span> <span class="o">=</span> <span class="kr">import</span> <span class="sx">./greeter.nix</span> <span class="p">{};</span>
<span class="kn">in</span>
<span class="p">{</span> <span class="nv">pkgs</span>    <span class="o">?</span> <span class="kr">import</span> <span class="o">&lt;</span><span class="nv">nixpkgs</span><span class="o">&gt;</span><span class="p">{},</span>
  <span class="nv">greeter</span> <span class="o">?</span> <span class="kr">import</span> <span class="sx">./greeter.nix</span><span class="p">{</span>
    <span class="nv">message</span> <span class="o">=</span> <span class="s2">"New Message"</span><span class="p">;</span>
  <span class="p">},</span>
<span class="p">}:</span><span class="kr">builtins</span><span class="o">.</span><span class="kr">derivation</span><span class="p">({</span>
  <span class="nv">name</span>    <span class="o">=</span> <span class="s2">"greeter2"</span><span class="p">;</span>
  <span class="nv">builder</span> <span class="o">=</span> <span class="nv">greeter</span><span class="o">.</span><span class="nv">builder</span><span class="p">;</span>
  <span class="nv">system</span>  <span class="o">=</span> <span class="nv">greeter</span><span class="o">.</span><span class="nv">system</span><span class="p">;</span>
  <span class="nv">args</span>    <span class="o">=</span> <span class="nv">greeter</span><span class="o">.</span><span class="nv">args</span><span class="p">;</span>
<span class="p">})</span>
</code></pre></div></div>

<p>Ok, so in <code class="language-plaintext highlighter-rouge">greeter2</code> we are essentially reimporting <code class="language-plaintext highlighter-rouge">greeter1</code> and
inheriting everything from it while just changing the message. But you
might say this is not necessarily the point! We already have a
function, that does this, why do we need to build another one?! Can’t
we just change the argument we are sending to the function in the
first place? And the answer to that is yes! - <em>great spot</em></p>

<h4 id="derivation-3">Derivation 3</h4>

<p><code class="language-plaintext highlighter-rouge">greeter3.nix</code></p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span>
  <span class="nv">g</span> <span class="o">=</span> <span class="kr">import</span> <span class="sx">./greeter.nix</span> <span class="p">{</span> <span class="nv">message</span> <span class="o">=</span> <span class="s2">"Something else"</span><span class="p">;</span> <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And that’s it! We’ve parametrised the build.</p>

<h2 id="conclusion">Conclusion</h2>

<p>I realise this is a long post, and i might break it down. But
hopefully it has been helpful and it gives you a place to start in the
world of <code class="language-plaintext highlighter-rouge">NIX</code>. I highly recommend it.</p>

<h2 id="further-reading-1">Further reading</h2>

<ul>
  <li><a href="https://nixos.wiki/wiki/">nixOS wiki</a></li>
</ul>]]></content><author><name></name></author><category term="nix" /><summary type="html"><![CDATA[I’ve been using NixOS and I quite like it (a lot). When I installed it, I got rid of my Debian and jumped head forwards with a full wipe out and clean instal. To be honest, it wasn’t that bad, and I managed to install everything in two attempts with around 1 hour of tweaking in the liveUSB version - but the documentation was nice, clear and easy to follow.]]></summary></entry><entry><title type="html">NIX: Small/Random, but Useful patterns</title><link href="https://cstml.github.io/2021/05/13/nix-patterns.html" rel="alternate" type="text/html" title="NIX: Small/Random, but Useful patterns" /><published>2021-05-13T00:00:00+00:00</published><updated>2021-05-13T00:00:00+00:00</updated><id>https://cstml.github.io/2021/05/13/nix-patterns</id><content type="html" xml:base="https://cstml.github.io/2021/05/13/nix-patterns.html"><![CDATA[<p>Say you have a few packages that you would like to build but you want an easy
way of doing so.  Here’s a handy little pattern that could help out.</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># suppose this is your default.nix</span>
<span class="c"># although I recommend separating the shell.</span>
<span class="p">{</span>
    <span class="nv">pkgs</span> <span class="o">?</span> <span class="kr">import</span> <span class="o">&lt;</span><span class="nv">nixpkgs</span><span class="o">&gt;</span><span class="p">{}</span>
<span class="p">}:</span><span class="kr">rec</span><span class="p">{</span>
  <span class="nv">output</span> <span class="o">=</span> <span class="kn">with</span> <span class="nv">pkgs</span><span class="p">;[</span><span class="nv">hello</span> <span class="nv">cowsay</span><span class="p">];</span>
  <span class="nv">shell</span> <span class="o">=</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">mkShell</span> <span class="p">{</span>
      <span class="nv">name</span> <span class="o">=</span> <span class="s2">"Shell"</span><span class="p">;</span>
      <span class="nv">buildInputs</span> <span class="o">=</span> <span class="nv">output</span><span class="p">;</span>
      <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p>So now to build everything in output all you need to do is run:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">nix-build</span> <span class="nv">default</span><span class="o">.</span><span class="nv">nix</span> <span class="o">-</span><span class="nv">A</span> <span class="nv">output</span>
</code></pre></div></div>
<p>which will subsequently generate all the derivations inside the list. And if
you just wanted to run a shell with them you could do:</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">nix-shell</span> <span class="nv">default</span><span class="o">.</span><span class="nv">nix</span> <span class="o">-</span><span class="nv">A</span> <span class="nv">shell</span>
</code></pre></div></div>
<p>and you would be in a shell with all your needed binaries included.</p>

<h2 id="nesting">Nesting</h2>

<p>So this is probably where I would say this pattern comes in handy. Let’s say
the above <code class="language-plaintext highlighter-rouge">default.nix</code> is actually inside a nested folder which we will call
<code class="language-plaintext highlighter-rouge">./nest</code>.</p>

<p>And we actually want to call the derivation inside our root folder <code class="language-plaintext highlighter-rouge">./.</code>. The
trick is to call them in the same way, from the root <code class="language-plaintext highlighter-rouge">default.nix</code>.</p>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span>
    <span class="nv">pkg</span> <span class="o">?</span> <span class="kr">import</span> <span class="sx">./nest</span> <span class="p">{}</span>
<span class="p">}</span>
<span class="p">:</span><span class="kd">let</span>
  <span class="nv">out</span> <span class="o">=</span> <span class="nv">pkg</span><span class="o">.</span><span class="nv">output</span><span class="p">;</span>
<span class="kn">in</span>
  <span class="nv">out</span>
</code></pre></div></div>

<hr />

<h2 id="zlib-package-haskell">Zlib package Haskell</h2>

<p>Working on my dissertation I wanted to have a <code class="language-plaintext highlighter-rouge">nix-shell</code> where I could test in
a fast manner my <em>web-interface</em> for the FMCt. I was initially doing this:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span> <span class="nv">release</span>  <span class="o">?</span> <span class="kr">import</span> <span class="sx">./release.nix</span>
<span class="p">,</span> <span class="nv">sources</span>  <span class="o">?</span> <span class="kr">import</span> <span class="sx">./nix/sources.nix</span>
<span class="p">,</span> <span class="nv">pkgs</span>     <span class="o">?</span> <span class="kr">import</span> <span class="nv">sources</span><span class="o">.</span><span class="nv">nixpkgs</span><span class="p">{}</span>
<span class="p">,</span> <span class="nv">FMCt-web</span> <span class="o">?</span> <span class="kr">import</span> <span class="sx">./default.nix</span>
<span class="p">}:</span>
<span class="nv">pkgs</span><span class="o">.</span><span class="nv">mkShell</span> <span class="p">{</span>
  <span class="nv">nativeBuildInputs</span> <span class="o">=</span> <span class="kn">with</span> <span class="nv">pkgs</span><span class="p">;[</span>
    <span class="nv">cabal-install</span>
    <span class="nv">ghcid</span> <span class="c"># ghcide</span>
    <span class="nv">gnumake</span>               <span class="c"># makefile</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">aeson</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">blaze-markup</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">hlint</span> <span class="c"># linting</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">scotty</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">zlib</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">ghc</span>
    <span class="nv">rlwrap</span>                <span class="c"># to be able to easily re-enter last input when in the repl</span>
  <span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The issue I was having was getting the following error:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;<span class="nb">command </span>line&gt;: can<span class="s1">'t load .so/.DLL for: libz.so (libz.so: cannot open shared object file: No such file or directory)
</span></code></pre></div></div>

<p>Which was very annoying, as I thouth I was provisioning both the environment and
the package for <code class="language-plaintext highlighter-rouge">haskellPackages.zlib</code>. Where I was wrong was in the following
bit: making the haskellPackages available to the environment is only useful if
we need the executables. If we need the libraries the correct way to do it is
the following:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span> <span class="nv">release</span>  <span class="o">?</span> <span class="kr">import</span> <span class="sx">./release.nix</span>
<span class="p">,</span> <span class="nv">sources</span>  <span class="o">?</span> <span class="kr">import</span> <span class="sx">./nix/sources.nix</span>
<span class="p">,</span> <span class="nv">pkgs</span>     <span class="o">?</span> <span class="kr">import</span> <span class="nv">sources</span><span class="o">.</span><span class="nv">nixpkgs</span><span class="p">{}</span>
<span class="p">,</span> <span class="nv">FMCt-web</span> <span class="o">?</span> <span class="kr">import</span> <span class="sx">./default.nix</span>
<span class="p">}:</span>
<span class="kd">let</span> 
  <span class="c"># add ghc packages that should be available to the ghc here</span>
  <span class="nv">ghc</span> <span class="o">=</span> <span class="p">(</span><span class="nv">pkgs</span><span class="o">.</span><span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">ghcWithPackages</span> <span class="p">(</span>
    <span class="nv">hpkgs</span><span class="p">:</span> <span class="kn">with</span> <span class="nv">hpkgs</span><span class="p">;[</span>
      <span class="nv">zlib</span>
      <span class="nv">scotty</span>
      <span class="nv">aeson</span>
      <span class="nv">blaze-markup</span>
      <span class="nv">aeson</span>
    <span class="p">]</span>
  <span class="p">));</span>
<span class="kn">in</span>
<span class="nv">pkgs</span><span class="o">.</span><span class="nv">mkShell</span> <span class="p">{</span>
  <span class="nv">nativeBuildInputs</span> <span class="o">=</span> <span class="kn">with</span> <span class="nv">pkgs</span><span class="p">;[</span>
    <span class="nv">cabal-install</span>
    <span class="nv">ghc</span>
    <span class="nv">haskellPackages</span><span class="o">.</span><span class="nv">hlint</span> <span class="c"># linting</span>
    <span class="c"># ... </span>
  <span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This was very helpful for me to see, that actually it is not the environment
that needs to be provisioned, but rather ghc itself. Hence why <code class="language-plaintext highlighter-rouge">ghcWithPackages</code>
solved the issue.</p>]]></content><author><name></name></author><category term="nix" /><summary type="html"><![CDATA[Say you have a few packages that you would like to build but you want an easy way of doing so. Here’s a handy little pattern that could help out.]]></summary></entry><entry><title type="html">Haskell: Monoids</title><link href="https://cstml.github.io/2021/05/03/haskell-monoid.html" rel="alternate" type="text/html" title="Haskell: Monoids" /><published>2021-05-03T00:00:00+00:00</published><updated>2021-05-03T00:00:00+00:00</updated><id>https://cstml.github.io/2021/05/03/haskell-monoid</id><content type="html" xml:base="https://cstml.github.io/2021/05/03/haskell-monoid.html"><![CDATA[<p>(<em>Edited: 7-05-2021</em>)</p>
<h1 id="monoids">Monoids</h1>

<p>Coming from the world of algebra, a monoid is a :</p>
<ul>
  <li>semigroup with an identity, which is a:
    <ul>
      <li>magma with associativity, which is a:
        <ul>
          <li>closed set, with a binary operation which is closed under it</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<p><em>So what?</em></p>

<p>Well believe it or not, Haskell defines a Monoid as a <code class="language-plaintext highlighter-rouge">Typeclass</code>, that lets you
do funky stuff. <strong>Great!</strong></p>

<p>Let’s have a go and demonstrate these funky useful stuff.</p>

<h2 id="use-case">Use case</h2>

<p>Say we have a parser that takes a list or stream of numbers and checks if any of
them are any of the following:</p>

<p>1) odd</p>

<p>2) divisible by 4</p>

<p>3) divisible by 6</p>

<p>… (you can carry on imagining adding rules here)</p>

<h3 id="first-solution">First Solution</h3>

<p>The first solution would be pretty straight forward:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">s1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span> <span class="c1">-- this one checks</span>
<span class="n">s2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span> <span class="c1">-- this one doesn't</span>

<span class="n">check</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check</span> <span class="kt">[]</span>      <span class="o">=</span> <span class="kt">False</span>
<span class="n">check</span> <span class="p">(</span><span class="n">x</span><span class="o">:</span><span class="n">xs</span><span class="p">)</span>  <span class="o">=</span>  <span class="n">odd</span> <span class="n">x</span>  <span class="o">||</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">x</span> <span class="n">'mod</span> <span class="mi">6</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">check</span> <span class="n">xs</span>

</code></pre></div></div>

<p>That’s all nice and tidy, but say you wanted to add another test - it can be a
bit annoying to chain another <code class="language-plaintext highlighter-rouge">|| test x</code> to the previous expression. So what
else can we do?</p>

<h3 id="second-solution">Second Solution</h3>

<p>Well, we can make an observation that all the functions:</p>

<p>1) are of the type <code class="language-plaintext highlighter-rouge">Int -&gt; Bool</code>,</p>

<p>2) we have a list of <code class="language-plaintext highlighter-rouge">[Int]</code>,</p>

<p>3) our type is <code class="language-plaintext highlighter-rouge">check :: [Int] -&gt; Bool</code>.</p>

<p>So in essence we need a way to take a list of <code class="language-plaintext highlighter-rouge">[Int-&gt;Bool]</code> tests, and map them
to <code class="language-plaintext highlighter-rouge">[Int]</code>. Then we flatten the list, and repeat until we get to the end of the
list of <code class="language-plaintext highlighter-rouge">[Int]</code> or we get <code class="language-plaintext highlighter-rouge">True</code> after we flatten.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="n">check'</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check'</span> <span class="kt">[]</span>      <span class="o">=</span> <span class="kt">False</span>
<span class="n">check'</span> <span class="p">(</span><span class="n">x</span><span class="o">:</span><span class="n">xs</span><span class="p">)</span>  <span class="o">=</span> <span class="n">foldl1</span> <span class="p">(</span><span class="o">||</span><span class="p">)</span> <span class="p">(</span> <span class="n">map</span> <span class="p">(</span><span class="o">$</span><span class="n">x</span><span class="p">)</span> <span class="n">tests</span><span class="p">)</span> <span class="o">||</span> <span class="n">check'</span> <span class="n">xs</span>
  <span class="kr">where</span>
    <span class="n">tests</span> <span class="o">=</span> <span class="p">[</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">t3</span> <span class="p">]</span>
    <span class="n">t1</span> <span class="o">=</span> <span class="n">odd</span>
    <span class="n">t2</span> <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="n">t3</span> <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">6</span> <span class="o">==</span> <span class="mi">0</span>
</code></pre></div></div>

<p>And realistically, even this form, if we look at the recursivity of <code class="language-plaintext highlighter-rouge">check'</code> we can
improve by observing that <code class="language-plaintext highlighter-rouge">check'</code> is very much a <code class="language-plaintext highlighter-rouge">map</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">check''</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check''</span> <span class="o">=</span> <span class="n">foldr1</span> <span class="p">(</span><span class="o">||</span><span class="p">)</span> <span class="o">.</span> <span class="n">map</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">foldl1</span> <span class="p">(</span><span class="o">||</span><span class="p">)</span> <span class="p">(</span> <span class="n">map</span> <span class="p">(</span><span class="o">$</span><span class="n">x</span><span class="p">)</span> <span class="n">tests</span><span class="p">))</span>
  <span class="kr">where</span>
    <span class="n">tests</span> <span class="o">=</span> <span class="p">[</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">t3</span> <span class="p">]</span>
    <span class="n">t1</span>    <span class="o">=</span> <span class="n">odd</span>
    <span class="n">t2</span>    <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="n">t3</span>    <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">6</span> <span class="o">==</span> <span class="mi">0</span>
</code></pre></div></div>

<p>Ok, I know what you are thinking, that might not be the nicest section ever, but
Haskell allows us to make it nicer by taking that <code class="language-plaintext highlighter-rouge">aux</code> function and declaring it
as such:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">check''</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check''</span> <span class="o">=</span> <span class="n">foldr1</span> <span class="p">(</span><span class="o">||</span><span class="p">)</span> <span class="o">.</span> <span class="n">map</span> <span class="n">aux</span>
  <span class="kr">where</span>
    <span class="n">aux</span> <span class="n">x</span> <span class="o">=</span> <span class="n">foldl1</span> <span class="p">(</span><span class="o">||</span><span class="p">)</span> <span class="p">(</span><span class="n">map</span> <span class="p">(</span><span class="o">$</span><span class="n">x</span><span class="p">)</span> <span class="n">tests</span><span class="p">)</span>
    <span class="n">tests</span> <span class="o">=</span> <span class="p">[</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">t3</span> <span class="p">]</span>
    <span class="n">t1</span>    <span class="o">=</span> <span class="n">odd</span>
    <span class="n">t2</span>    <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="n">t3</span>    <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">6</span> <span class="o">==</span> <span class="mi">0</span>
</code></pre></div></div>

<h3 id="option-3">Option 3</h3>

<p>Ok so we’ve done it in a more flexible way, but where does the <strong>Monoid</strong> come
into play. Well if we remember the properties from the introduction and we have
a look in ghci at the <code class="language-plaintext highlighter-rouge">:info Monoid</code> we find out a few things. From <code class="language-plaintext highlighter-rouge">Semigroup
typeclass</code> we get:</p>

<ol>
  <li>
    <p>We have a function <code class="language-plaintext highlighter-rouge">mappend</code> that has the type signature <code class="language-plaintext highlighter-rouge">Semigroup a =&gt; a -&gt;
a -&gt; a</code>. So what this does is takes two elements, applies the monoids
operation and returns the result.</p>
  </li>
  <li>
    <p>We have this other function <code class="language-plaintext highlighter-rouge">mconcat</code> with the signature <code class="language-plaintext highlighter-rouge">Semigroup a =&gt; [a]
-&gt; a</code>. This one takes a list of elements and flattens it with the binary
operation.</p>
  </li>
  <li>
    <p>We find out that <code class="language-plaintext highlighter-rouge">[a]</code> (so any list) is a <code class="language-plaintext highlighter-rouge">monoid</code>.</p>
  </li>
  <li>
    <p>We find out about the existence of <code class="language-plaintext highlighter-rouge">All</code> and <code class="language-plaintext highlighter-rouge">Any</code> two <code class="language-plaintext highlighter-rouge">Monoids</code>. When we
look at their <code class="language-plaintext highlighter-rouge">info: All</code> and <code class="language-plaintext highlighter-rouge">info: Any</code> we find out that they are a 
<code class="language-plaintext highlighter-rouge">newtype Any = Any {getAny :: Bool}</code>. Nice!</p>
  </li>
</ol>

<p>So let’s try and get these to work for us.</p>

<p>Let’s start by defining our tests as higher order monoids first:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">newtype</span> <span class="kt">Tester</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">Tester</span> <span class="p">{</span><span class="n">getTest</span> <span class="o">::</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">Any</span><span class="p">}</span>
<span class="kr">instance</span> <span class="kt">Semigroup</span> <span class="p">(</span><span class="kt">Tester</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
  <span class="n">f1</span> <span class="o">&lt;&gt;</span> <span class="n">f2</span> <span class="o">=</span> <span class="kt">Tester</span> <span class="o">$</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">getTest</span> <span class="n">f1</span><span class="p">)</span> <span class="n">x</span> <span class="o">&lt;&gt;</span> <span class="p">(</span><span class="n">getTest</span> <span class="n">f2</span><span class="p">)</span> <span class="n">x</span>

<span class="kr">instance</span> <span class="kt">Monoid</span> <span class="p">(</span><span class="kt">Tester</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
  <span class="n">mempty</span> <span class="o">=</span> <span class="kt">Tester</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="kt">Any</span> <span class="kt">False</span><span class="p">)</span>
</code></pre></div></div>

<p>Awesome, the type checks (that’s a good hint that the rules might be good) and
we can also see that the Monoid laws hold(left as an exercise for the
reader). Also by using the Monoid <code class="language-plaintext highlighter-rouge">Any</code> in the type signature we know we can
further flatten it. So our function now becomes a lot clearer/cleaner, and
nicer:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">check'''</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check'''</span>   <span class="o">=</span>  <span class="n">getAny</span> <span class="o">.</span> <span class="n">mconcat</span> <span class="o">.</span> <span class="n">map</span> <span class="n">aTests</span>
  <span class="kr">where</span>
    <span class="n">aTests</span> <span class="o">=</span> <span class="n">mconcat</span> <span class="o">$</span> <span class="n">map</span> <span class="p">(</span><span class="n">getTest</span> <span class="o">.</span> <span class="kt">Tester</span><span class="p">)</span> <span class="n">lstT</span>
    <span class="n">lstT</span>  <span class="o">::</span> <span class="p">[(</span><span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Any</span><span class="p">)]</span>
    <span class="n">lstT</span>   <span class="o">=</span> <span class="p">[</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">,</span><span class="n">t3</span><span class="p">]</span>
    <span class="n">t1</span>     <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="kt">Any</span> <span class="o">$</span> <span class="n">odd</span> <span class="n">x</span>
    <span class="n">t2</span>     <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="kt">Any</span> <span class="o">$</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="n">t3</span>     <span class="o">=</span> <span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="kt">Any</span> <span class="o">$</span> <span class="n">x</span> <span class="p">`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">6</span> <span class="o">==</span> <span class="mi">0</span>
</code></pre></div></div>

<p>And now let’s transform those tests into sections, as they read nicer:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">check''''</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check''''</span>  <span class="o">=</span>  <span class="n">getAny</span> <span class="o">.</span> <span class="n">mconcat</span> <span class="o">.</span> <span class="n">map</span> <span class="n">aTests</span>
  <span class="kr">where</span>
    <span class="n">aTests</span> <span class="o">=</span> <span class="n">mconcat</span> <span class="o">$</span> <span class="n">map</span> <span class="p">(</span><span class="n">getTest</span> <span class="o">.</span> <span class="kt">Tester</span><span class="p">)</span> <span class="n">lstT</span>
    <span class="n">lstT</span>  <span class="o">::</span> <span class="p">[(</span><span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Any</span><span class="p">)]</span>
    <span class="n">lstT</span>   <span class="o">=</span> <span class="p">[</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">,</span><span class="n">t3</span><span class="p">]</span>
    <span class="n">t1</span>     <span class="o">=</span> <span class="kt">Any</span> <span class="o">.</span> <span class="n">odd</span> 
    <span class="n">t2</span>     <span class="o">=</span> <span class="kt">Any</span> <span class="o">.</span> <span class="p">(</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="o">.</span> <span class="n">flip</span> <span class="n">mod</span> <span class="mi">4</span> 
    <span class="n">t3</span>     <span class="o">=</span> <span class="kt">Any</span> <span class="o">.</span> <span class="p">(</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="o">.</span> <span class="n">flip</span> <span class="n">mod</span> <span class="mi">6</span> 
</code></pre></div></div>

<p>And as suggested <a href="https://twitter.com/Cstml1/status/1389326877756739602">here</a>
(thank you for the suggestions) we can further neaten it up by using the <em>infix
notation</em> for <code class="language-plaintext highlighter-rouge">mod</code> together with partial application:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">check</span>  <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">check</span> <span class="o">=</span> <span class="n">getAny</span> <span class="o">.</span> <span class="n">mconcat</span> <span class="o">.</span> <span class="n">map</span> <span class="n">aTests</span>
  <span class="kr">where</span>
    <span class="n">aTests</span> <span class="o">=</span> <span class="n">mconcat</span> <span class="o">$</span> <span class="n">map</span> <span class="p">(</span><span class="n">getTest</span> <span class="o">.</span> <span class="kt">Tester</span><span class="p">)</span> <span class="n">lstT</span>
    <span class="n">lstT</span>  <span class="o">::</span> <span class="p">[(</span><span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Any</span><span class="p">)]</span>
    <span class="n">lstT</span>   <span class="o">=</span> <span class="p">[</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">,</span><span class="n">t3</span><span class="p">]</span>
    <span class="n">t1</span>     <span class="o">=</span> <span class="kt">Any</span> <span class="o">.</span> <span class="n">odd</span> 
    <span class="n">t2</span>     <span class="o">=</span> <span class="kt">Any</span> <span class="o">.</span> <span class="p">(</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="o">.</span> <span class="p">(`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">4</span><span class="p">)</span>
    <span class="n">t3</span>     <span class="o">=</span> <span class="kt">Any</span> <span class="o">.</span> <span class="p">(</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="o">.</span> <span class="p">(`</span><span class="n">mod</span><span class="p">`</span> <span class="mi">6</span><span class="p">)</span>
</code></pre></div></div>

<p>We can extend this type of manipulation to most monoids, and internalising the
rules and general capabilities can lead to pretty awesome solutions, and applications.</p>

<h3 id="further-reading">Further Reading</h3>

<ul>
  <li><a href="https://wiki.haskell.org/Monoid">wiki.haskell</a></li>
</ul>

<p>Roger out!</p>]]></content><author><name></name></author><category term="haskell" /><summary type="html"><![CDATA[Well believe it or not, Haskell defines a Monoid as a Typeclass, that lets you do funky stuff. Great!]]></summary></entry><entry><title type="html">Haskell: Functor</title><link href="https://cstml.github.io/2021/05/03/haskell-functor.html" rel="alternate" type="text/html" title="Haskell: Functor" /><published>2021-05-03T00:00:00+00:00</published><updated>2021-05-03T00:00:00+00:00</updated><id>https://cstml.github.io/2021/05/03/haskell-functor</id><content type="html" xml:base="https://cstml.github.io/2021/05/03/haskell-functor.html"><![CDATA[<p>Coming from the world of category theory, a functor is a mapping between two
categories:</p>

<ul>
  <li>
    <p>in the world of Haskell, usually you can think of it as a type constructor
with some special properties. It takes an object and it wraps it.</p>
  </li>
  <li>
    <p>Functors are the building blocks of most <code class="language-plaintext highlighter-rouge">typeclasses</code> in Haskell</p>

    <ul>
      <li>If that sounds like a bold claim, 
<a href="https://wiki.haskell.org/File:Typeclassopedia-diagram.png">Have a look here to convince yourself</a></li>
    </ul>
  </li>
  <li>
    <p>Functors are (by definition) the <em>pipes</em> between categories - you might be
using them already without realising</p>
  </li>
</ul>

<h2 id="use-case">Use case</h2>

<p>We use Functors all the time - it is hard to think of a case where you wouldn’t
use it.</p>

<h3 id="the-identity-functor">The Identity Functor</h3>

<p>Let’s create the simplest functor possible</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Identity</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">Identity</span> <span class="n">a</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Eq</span><span class="p">,</span> <span class="kt">Ord</span><span class="p">,</span> <span class="kt">Show</span><span class="p">)</span>

<span class="kr">instance</span> <span class="kt">Functor</span> <span class="kt">Identity</span> <span class="kr">where</span>
  <span class="n">fmap</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Identity</span> <span class="n">m</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Identity</span> <span class="o">$</span> <span class="n">f</span> <span class="n">m</span>
</code></pre></div></div>

<ul>
  <li>
    <p>TL;DR What does it do?</p>

    <ul>
      <li>Transforms whatever you give to it into the  <code class="language-plaintext highlighter-rouge">Identity</code> type.</li>
    </ul>
  </li>
  <li>
    <p>What does it need to implement to be a Functor?</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">fmap</code> aka <code class="language-plaintext highlighter-rouge">&lt;$&gt;</code> with the type signature <code class="language-plaintext highlighter-rouge">(a -&gt; b) -&gt; f a -&gt; f b</code>. It is
pretty intuitive this one takes a function from <code class="language-plaintext highlighter-rouge">a -&gt; b</code> and transforms the
functor <code class="language-plaintext highlighter-rouge">f a</code> into a functor <code class="language-plaintext highlighter-rouge">f b</code>. Easy.</li>
    </ul>
  </li>
</ul>

<hr />

<ul>
  <li>
    <p>What laws does it need to satisfy?</p>

    <ul>
      <li>
        <p>it must preserve the identity morphism</p>

        <ul>
          <li><code class="language-plaintext highlighter-rouge">fmap Id = Id</code></li>
        </ul>
      </li>
      <li>
        <p>it also must preserve composition of morphisms</p>

        <ul>
          <li><code class="language-plaintext highlighter-rouge">fmap (f . g) = fmap f . fmap g</code></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<hr />

<ul>
  <li>A few examples using our Identity functor:</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fmap</span> <span class="p">(</span><span class="o">+</span><span class="mi">3</span><span class="p">)</span> <span class="o">$</span> <span class="kt">Identity</span> <span class="mi">3</span> <span class="c1">-- 6</span>
<span class="p">(</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>  <span class="o">&lt;$&gt;</span> <span class="o">$</span> <span class="kt">Identity</span> <span class="mi">4</span> <span class="c1">-- 8</span>
</code></pre></div></div>

<hr />

<ul>
  <li>Other functor functions:</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&lt;$</span> <span class="o">::</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</code></pre></div></div>

<ul>
  <li>
    <p>It’s <em>half the fmap to the left</em> (if that makes sense?). You give it an
element and then you give it a functor, and it returns the element wrapped in
the functor (a bit like <em>it pushes the element out</em> of the functor and
replaces it with what is on the left).</p>
  </li>
  <li>
    <p>an example:</p>
    <div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">5</span> <span class="o">&lt;$</span> <span class="kt">Identity</span> <span class="mi">6</span>  <span class="c1">-- Identity 5</span>
</code></pre></div>    </div>
  </li>
</ul>

<hr />

<ul>
  <li>That is quite neat. You can even use it with higher types for example:</li>
</ul>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;$</span> <span class="kt">Identity</span> <span class="mi">5</span> <span class="c1">-- of the type :: Num a =&gt; Identity (a -&gt; a)</span>
</code></pre></div></div>

<p>Do you see what happened? We now have a higher order <code class="language-plaintext highlighter-rouge">Identity</code> type - a
function wrapped in <code class="language-plaintext highlighter-rouge">Identity</code>. But what can we do with it? Well we can apply
it - with <code class="language-plaintext highlighter-rouge">fmap</code> again.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fmap</span> <span class="p">(</span><span class="o">$</span><span class="mi">5</span><span class="p">)</span> <span class="p">((</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;$</span> <span class="kt">Identity</span> <span class="mi">3</span><span class="p">)</span> <span class="c1">-- Identity 6</span>
</code></pre></div></div>

<ul>
  <li>
    <p>We basically flipped the roles of the function and application. And of course
<code class="language-plaintext highlighter-rouge">($5) :: (a -&gt; b) -&gt; b</code> is a function that takes a function and it applies
to <code class="language-plaintext highlighter-rouge">5</code>.</p>
  </li>
  <li>
    <p>Also, if you <code class="language-plaintext highlighter-rouge">import Data.Functor</code> you get <code class="language-plaintext highlighter-rouge">$&gt;</code> (which is as you guessed the
opposite of <code class="language-plaintext highlighter-rouge">&lt;$</code>) and <code class="language-plaintext highlighter-rouge">void</code> which is <code class="language-plaintext highlighter-rouge">:: f a -&gt; f ()</code>. Pretty straight
forward.</p>
  </li>
</ul>

<h3 id="in-the-end">In the end</h3>

<p>That was it for today. I will try and make an article on each <code class="language-plaintext highlighter-rouge">typeclass</code> of
Haskell as I am quite enjoying writing these. The next one will probably be on
<code class="language-plaintext highlighter-rouge">Applicative Functors</code>, which you probably know where it leads to.</p>

<hr />

<h3 id="more-reading">More reading</h3>

<p>These are all very basic applications and simple examples. But if you are
curious here is some further reading:</p>

<ul>
  <li><a href="https://github.com/hmemcpy/milewski-ctfp-pdf">Bartosz Milewski’s Book is a fantastic resource</a></li>
  <li><a href="https://wiki.haskell.org/Functor">HaskelWiki</a></li>
  <li><a href="https://www.haskellforall.com/2012/09/the-functor-design-pattern.html">HaskellForAll Article</a></li>
  <li><a href="https://hackage.haskell.org/package/base-4.15.0.0/docs/Prelude.html#t:Functor">Haddock</a></li>
</ul>]]></content><author><name></name></author><category term="haskell" /><summary type="html"><![CDATA[Coming from the world of category theory, a functor is a mapping between two categories:]]></summary></entry><entry><title type="html">CLisp: Thread last - like Clojure</title><link href="https://cstml.github.io/2021/02/21/lisp-thread.html" rel="alternate" type="text/html" title="CLisp: Thread last - like Clojure" /><published>2021-02-21T00:00:00+00:00</published><updated>2021-02-21T00:00:00+00:00</updated><id>https://cstml.github.io/2021/02/21/lisp-thread</id><content type="html" xml:base="https://cstml.github.io/2021/02/21/lisp-thread.html"><![CDATA[<p>These days I’ve been playing with <code class="language-plaintext highlighter-rouge">Clojure</code> and one macro I really liked was
<code class="language-plaintext highlighter-rouge">-&gt;&gt;</code> which is called <code class="language-plaintext highlighter-rouge">Thread last</code>. Let’s implement it in Common Lisp.</p>

<h2 id="what-does-it-do">What does it do</h2>

<p>Thread last is very cool. In essence it takes the result of your one function
call and threads it in front of another one. Let me show you what I mean</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">-&gt;&gt;</span> <span class="mi">1</span> 
     <span class="p">(</span><span class="nb">+</span> <span class="mi">2</span> <span class="p">)</span> 
     <span class="p">(</span><span class="nb">+</span> <span class="mi">3</span> <span class="p">)</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">4</span> <span class="p">))</span> <span class="c1">; -&gt; 10</span>
</code></pre></div></div>

<p>And the more explicit  version of it</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">-&gt;&gt;</span> <span class="mi">1</span>       <span class="c1">; let's call it X to see it</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">2</span> <span class="p">)</span>  <span class="c1">; this gets transformed to (+ 2 X), let's call the result of this Y</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">3</span> <span class="p">)</span>  <span class="c1">; this gets transformed to (+ 3 Y), let's call the result of this Z</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">4</span> <span class="p">))</span> <span class="c1">; this gets transformed to (+ 3 Z)  whic is then equal to 10</span>
</code></pre></div></div>

<p>Pretty cool , because otherwise the operation would have been written as :</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">+</span> <span class="mi">4</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">3</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">)))</span>
</code></pre></div></div>

<p>In this case it is not the worst - but the longer the calls the more complex
the calls the more you would need to read from inside out.</p>

<h2 id="clisp-doesnt-have-this">CLisp doesn’t have this</h2>

<p>Or at least <strong>yet</strong> CLisp doesn’t, I read somewhere that Clisp 21 does. But,
let us have a go at implementing it</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defmacro</span> <span class="nv">-&gt;&gt;</span> <span class="p">(</span><span class="nv">var</span> <span class="k">&amp;rest</span> <span class="nv">lst</span><span class="p">)</span>
  <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">car</span> <span class="nv">lst</span><span class="p">)</span> <span class="c1">; if the lists of remaining operations is not empty</span>
      <span class="o">`</span><span class="p">(</span><span class="nv">-&gt;&gt;</span> <span class="p">(</span><span class="o">,@</span><span class="p">(</span><span class="nb">car</span> <span class="nv">lst</span><span class="p">)</span> <span class="o">,</span><span class="nv">var</span><span class="p">)</span> <span class="o">,@</span><span class="p">(</span><span class="nb">cdr</span> <span class="nv">lst</span><span class="p">))</span> <span class="c1">; recursively call the macro</span>
      <span class="o">`,</span><span class="nv">var</span><span class="p">))</span> <span class="c1">; otherwise, return the var.</span>
</code></pre></div></div>

<p>So what the above macro is recursively create the call. Let’s run through the
above example step by step to see the macroexpansion</p>

<hr />

<h3 id="step-by-step-macroexpansion">Step by step Macroexpansion</h3>

<h4 id="step-0---the-call-itself">Step 0 - The call itself</h4>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">-&gt;&gt;</span> <span class="mi">1</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">2</span><span class="p">)</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">3</span><span class="p">)</span>
     <span class="p">(</span><span class="nb">+</span> <span class="mi">4</span><span class="p">))</span>
</code></pre></div></div>

<p>or inline it would be</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(-&gt;&gt; 1 (+ 2) (+ 3) (+ 4))
</code></pre></div></div>

<h4 id="step-1---the-first-macro-expansion">Step 1 - The first macro-expansion</h4>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(-&gt;&gt; (+ 2 1) (+ 3) (+ 4))
</code></pre></div></div>

<p>So we see, the macro takes the first element of the list and the first element
of the arguments and places the it at the end of this call. Then it recursively
calls itself again.</p>

<h4 id="step-2---the-first-macro-expansion-again">Step 2 - The first macro-expansion (again)</h4>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">-&gt;&gt;</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">3</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">))</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">4</span><span class="p">))</span>
</code></pre></div></div>

<p>It treates (+ 2 1) as it treated 1 and it appends it to the <code class="language-plaintext highlighter-rouge">car</code> of the opperation list</p>

<h4 id="step-3---you-guessed-it-the-first-macro-expansion-again">Step 3 - You guessed it, the first macro-expansion (again)</h4>
<p>But this time it is the second branch of the if</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">+</span> <span class="mi">4</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">3</span> <span class="p">(</span><span class="nb">+</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">)))</span>
</code></pre></div></div>

<h4 id="step-4---rejoice">Step 4 - Rejoice</h4>

<p>… and marvel, at how easy it was to implement the feature of <code class="language-plaintext highlighter-rouge">clojure</code> in
<code class="language-plaintext highlighter-rouge">common lisp</code> using a simple recursive <code class="language-plaintext highlighter-rouge">macro</code>.</p>]]></content><author><name></name></author><category term="common-lisp" /><summary type="html"><![CDATA[These days I’ve been playing with Clojure and one macro I really liked was -&gt;&gt; which is called Thread last. Let’s implement it in Common Lisp.]]></summary></entry></feed>