<?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="rubenpieters.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="rubenpieters.github.io/" rel="alternate" type="text/html" /><updated>2026-02-01T13:37:20+00:00</updated><id>rubenpieters.github.io/feed.xml</id><title type="html">rubenpieters</title><author><name>rubenpieters</name></author><entry><title type="html">Parallel/Sequential versus OnStart/OnComplete</title><link href="rubenpieters.github.io/programming/2020/01/29/parallel-sequential-1.html" rel="alternate" type="text/html" title="Parallel/Sequential versus OnStart/OnComplete" /><published>2020-01-29T00:00:00+00:00</published><updated>2020-01-29T00:00:00+00:00</updated><id>rubenpieters.github.io/programming/2020/01/29/parallel-sequential-1</id><content type="html" xml:base="rubenpieters.github.io/programming/2020/01/29/parallel-sequential-1.html"><![CDATA[<p>In this post I give some thoughts on the use of <code class="language-plaintext highlighter-rouge">parallel</code> and <code class="language-plaintext highlighter-rouge">sequential</code> in favor of <code class="language-plaintext highlighter-rouge">onStart</code> and <code class="language-plaintext highlighter-rouge">onComplete</code> for an animation library. The reason why I think it is interesting to look at is because the latter seems to be much more common in many animation libraries such as for example <a href="https://animejs.com/documentation/#beginComplete">anime.js</a>, <a href="https://greensock.com/docs/v2/TweenMax/eventCallback()">GSAP</a>, <a href="https://github.com/julianshapiro/velocity/wiki/Option---Begin">Velocity.js</a> or <a href="https://photonstorm.github.io/phaser3-docs/Phaser.Tweens.Tween.html">Phaser Tweens</a>. However, as I have mentioned <a href="/programming/haskell/2019/07/09/animation-dsl-1.html">before</a>, I am not very thrilled by this interface for animations. However, I wasn’t quite able to articulate my annoyance beyond a simple “I don’t really like it”. Since then, I think I have found a way to express what exactly is bothering me with this common approach to describe animations.</p>

<h1 id="syntax--semantics">Syntax &amp; Semantics</h1>

<p>In linguistics there is the concept of <em>syntax</em> and <em>semantics</em>. The syntax comprises of the possible constructions that can be made in a language, while semantics is the actual meaning ascribed to those constructions. This terminology is equally applicable to domain-specific languages (DSLs), such as for example for expressing animations.</p>

<p>I think the key lies in the difference of the expected <em>semantics</em> of the two approaches. So, as a starting point, I want to gave a basic explanation of these concepts.</p>

<h2 id="syntax">Syntax</h2>

<p>First, let’s define syntax for two different animation DSLs: a <em>combinator</em>-style DSL and a <em>callback</em>-style DSL.</p>

<h3 id="combinator-style-dsl">Combinator-Style DSL</h3>

<p>In the combinator-style DSL we have three main concepts: basic animations, sequential animations and parallel animations. Basic animations are atomic units of animation. A simple example of such unit is the linear interpolation between a from and to value. A more complex example is the morphing of a shape into another shape. In contrast with the atomic units of animation are the composed animations. A sequential animation is the sequential composition of two animations, while the parallel animations is the parallel composition of two animations. We can describe the syntax for this DSL in <a href="https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form">Backus-Naur form (BNF)</a>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Combinator-Style BNF

&lt;animation&gt; ::= basic
              | &lt;animation&gt; parallel &lt;animation&gt;
              | &lt;animation&gt; sequential &lt;animation&gt;
</code></pre></div></div>

<p>If you are not familiar with BNF, it gives a convenient notation for describing syntax. The rules above can be read as follows: an animation is either a basic animation OR an animation in parallel with another animation OR an animation in sequence with another animation. The reference to animation is a recursive reference, so the mention of <code class="language-plaintext highlighter-rouge">&lt;animation&gt;</code> in the <code class="language-plaintext highlighter-rouge">parallel</code> or <code class="language-plaintext highlighter-rouge">sequential</code> declarations refers to the definition itself. Below are some examples that can be expressed with this syntax:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>basic
basic parallel basic
basic sequential basic
(basic parallel basic) sequential basic
basic parallel (basic sequential basic)
(basic parallel basic) sequential (basic parallel basic)
...
</code></pre></div></div>

<p>The expression <code class="language-plaintext highlighter-rouge">basic</code> can be replaced with any suitable basic animation, such as <code class="language-plaintext highlighter-rouge">change box alpha from 0 to 1 for 1 second</code> or <code class="language-plaintext highlighter-rouge">morph box from square to circle for 2 seconds</code>. Which basic animations are or are not available isn’t relevant for the points made in this post. Rather, the focus of this post is on the different styles of composing animations.</p>

<h3 id="callback-style-dsl">Callback-Style DSL</h3>

<p>In the callback-style DSL we similarly have three basic concepts: basic animations and composed animations using either <code class="language-plaintext highlighter-rouge">onStart</code> or <code class="language-plaintext highlighter-rouge">onComplete</code>. We can think of <code class="language-plaintext highlighter-rouge">x onStart y</code> as shorthand for something like <code class="language-plaintext highlighter-rouge">x.onStart(() =&gt; y)</code>, it registers animation <code class="language-plaintext highlighter-rouge">y</code> to play when animation <code class="language-plaintext highlighter-rouge">x</code> starts, and similarly for <code class="language-plaintext highlighter-rouge">onComplete</code> to register on the completion of an animation. Of course, for now this is merely syntax and the exact meaning will be decided once we define semantics.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Callback-Style BNF

&lt;animation&gt; ::= basic
              | &lt;animation&gt; onStart &lt;animation&gt;
              | &lt;animation&gt; onComplete &lt;animation&gt;
</code></pre></div></div>

<p>Again, for illustrative purposes, let’s look at some examples that can be expressed with this syntax:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>basic
basic onStart basic
basic onComplete basic
(basic onStart basic) onComplete basic
basic onStart (basic onComplete basic)
(basic onStart basic) onComplete (basic onStart basic)
...
</code></pre></div></div>

<h2 id="semantics">Semantics</h2>

<p>The syntax we described does not mean anything yet until we give semantics for it. These semantics can be whatever we want. We could create an awkward notation for simple arithmetic by stating that the meaning of <code class="language-plaintext highlighter-rouge">basic</code> is <code class="language-plaintext highlighter-rouge">1</code>, the meaning of <code class="language-plaintext highlighter-rouge">parallel</code> is <code class="language-plaintext highlighter-rouge">+</code> and the meaning of <code class="language-plaintext highlighter-rouge">sequential</code> is <code class="language-plaintext highlighter-rouge">*</code>. But, we are in the process of creating a DSL for animations, so probably our semantics should have something to do with those.</p>

<p>There are different ways of giving meaning to syntax. Here, we give so-called <a href="https://en.wikipedia.org/wiki/Denotational_semantics"><em>denotational semantics</em></a>. This means that the meaning of syntax is described by certain mathematical objects. For example, the mathematical object used as domain for the awkward syntax of arithmetic is the natural numbers.</p>

<p>For semantics of animations we work a bit more informally. The domain for this context is a <em>timeline</em>. This timeline describes what is going on in the animation for each point in time.</p>

<p>For example, the animation in this picture:</p>

<center><img src="/assets/par-seq-1/color_anim.gif" /></center>

<p>can be described with the following timeline:</p>

<center><img src="/assets/par-seq-1/anim_color_timeline.png" /></center>

<p>From <code class="language-plaintext highlighter-rouge">t=0</code> until <code class="language-plaintext highlighter-rouge">t=1</code> the background fades from black to blue. Then, at the same time, from <code class="language-plaintext highlighter-rouge">t=1</code> to <code class="language-plaintext highlighter-rouge">t=2</code> the left part fades from blue to red and the right part fades from blue to yellow.</p>

<h3 id="basic">Basic</h3>

<p>The semantics of the <code class="language-plaintext highlighter-rouge">basic</code> expression is a simple box in the timeline. From <code class="language-plaintext highlighter-rouge">t=0</code> until <code class="language-plaintext highlighter-rouge">t=x</code>, where <code class="language-plaintext highlighter-rouge">x</code> is the length of the animation, a certain part of the application is transformed.</p>

<p>For example, the animation <code class="language-plaintext highlighter-rouge">fade background from black to blue for 1 second</code> has the following semantics:</p>

<center><img src="/assets/par-seq-1/basic_fade.png" /></center>

<h3 id="combinator-style-dsl-1">Combinator-Style DSL</h3>

<p>Typically, denotational semantics is <em>compositional</em>: the meaning of a composed expression is built out of the meaning of its sub-expressions. This is also the case here, since the semantics of an <code class="language-plaintext highlighter-rouge">x parallel y</code> expression is given by the semantics of <code class="language-plaintext highlighter-rouge">x</code> occurring at the same time in the timeline as the semantics of <code class="language-plaintext highlighter-rouge">y</code>. Visually, we can describe it as follows:</p>

<center><img src="/assets/par-seq-1/semantics_parallel.png" /></center>

<p>Similarly, for an <code class="language-plaintext highlighter-rouge">x sequential y</code> expression, where <code class="language-plaintext highlighter-rouge">y</code> occurs after <code class="language-plaintext highlighter-rouge">x</code> in the timeline:</p>

<center><img src="/assets/par-seq-1/semantics_sequential.png" /></center>

<p>Remember that each of the <code class="language-plaintext highlighter-rouge">x</code> or <code class="language-plaintext highlighter-rouge">y</code> animations can in turn be composed animations. For example, the timeline of <code class="language-plaintext highlighter-rouge">(a parallel b) sequential c</code> is:</p>

<center><img src="/assets/par-seq-1/combinator_example.png" /></center>

<h3 id="callback-style-dsl-">Callback-Style DSL (?)</h3>

<p>We might expect that we can proceed in the same way for the semantics for the callback-style syntax. The <code class="language-plaintext highlighter-rouge">onStart</code> operator could have the same semantics as <code class="language-plaintext highlighter-rouge">parallel</code> and the <code class="language-plaintext highlighter-rouge">onComplete</code> operator could have the same semantics as <code class="language-plaintext highlighter-rouge">sequential</code>:</p>

<center><img src="/assets/par-seq-1/semantics_callback_wrong.png" /></center>

<p>However, no actual implementation of the <code class="language-plaintext highlighter-rouge">onStart</code>/<code class="language-plaintext highlighter-rouge">onComplete</code> style adheres to these semantics. Take the following example: <code class="language-plaintext highlighter-rouge">(a onStart b) onComplete c</code>. If we copy the <code class="language-plaintext highlighter-rouge">parallel</code>/<code class="language-plaintext highlighter-rouge">sequential</code> semantics, then we get the timeline as we saw earlier:</p>

<center><img src="/assets/par-seq-1/wrong_example_exp.png" /></center>

<p>The <strong>actual</strong> timeline resulting from the implementation, however, is the following:</p>

<center><img src="/assets/par-seq-1/wrong_example_actual.png" /></center>

<p>Remember that <code class="language-plaintext highlighter-rouge">(a onStart b) onComplete c</code> in, for example, a JavaScript animation library is something like <code class="language-plaintext highlighter-rouge">a.onStart(() =&gt; b).onComplete(() =&gt; c)</code>. This means that both the <code class="language-plaintext highlighter-rouge">onStart</code> and <code class="language-plaintext highlighter-rouge">onComplete</code> callbacks are attached to the animation <code class="language-plaintext highlighter-rouge">a</code>. The animation <code class="language-plaintext highlighter-rouge">c</code> is attached to the end of animation <code class="language-plaintext highlighter-rouge">a</code>, it is not possible to attach a callback to the composed animation <code class="language-plaintext highlighter-rouge">a onStart b</code> as a whole<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>

<h3 id="callback-style-dsl-1">Callback-Style DSL</h3>

<p>Since the earlier semantics doesn’t quite capture the actual behaviour, we have to come up with something else that does. The key difference is that composition of animations is not based on the start and end point of the composed sub-animations. Instead, we need to keep track of specific start and end points which signify where the second operand of an <code class="language-plaintext highlighter-rouge">onStart</code> and <code class="language-plaintext highlighter-rouge">onComplete</code> operator will be attached to.</p>

<p>For the callback-style dsl, we have to update the semantics of the <code class="language-plaintext highlighter-rouge">basic</code> expression to take into account these attachment points. So, the semantics of <code class="language-plaintext highlighter-rouge">basic</code> is again a box in the timeline, where the start attachment point is at the start of the animation and the end attachment point is at the end.</p>

<center><img src="/assets/par-seq-1/basic_cb.png" /></center>

<p>Now, we can define the semantics of an <code class="language-plaintext highlighter-rouge">x onStart y</code> expression: attach animation y to the start attachment point of animation x. Similarly, the semantics for an <code class="language-plaintext highlighter-rouge">x onComplete y</code> expression: attach animation y to the end attachment point of animation x. Visually we can represent it like this:</p>

<center><img src="/assets/par-seq-1/semantics_cb.png" /></center>

<p>The attachment points for the composed animation are derived from the attachment points of the first operand.</p>

<p>Now, the actual implementation follows our defined semantics of <code class="language-plaintext highlighter-rouge">(a onStart b) onComplete c</code>:</p>

<center><img src="/assets/par-seq-1/corrected_example.png" /></center>

<h1 id="combinator-style--callback-style">Combinator-style &gt; Callback-style</h1>

<p>We have defined two different DSLs for animations, given some simple syntax and an informal explanation of the semantics. Is one better suited to the task of creating animations than the other? I prefer the combinator-style for two main reasons.</p>

<p>First, when I create an animation I think of it in terms of its behaviour as I have been describing them with timelines as in the pictures of this post. I find it a very convenient approach, which easily maps to getting the results you expect on the screen. Since the combinator-style operators more directly express the timeline semantics that I expect, it seems clearly better in this regard.</p>

<p>Second, the callback-style is less expressive when viewed as it is presented here<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. What I mean with that is: every timeline that is expressible in the callback-style is expressible with the combinator-style, but not vice versa. This can be derived from the fact that <code class="language-plaintext highlighter-rouge">(a parallel b) sequential c</code>, where the durations of <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code> are not known upfront, can not be expressed with the callback-style and we can implement the <code class="language-plaintext highlighter-rouge">onStart</code>/<code class="language-plaintext highlighter-rouge">onComplete</code> operators using the <code class="language-plaintext highlighter-rouge">parallel</code>/<code class="language-plaintext highlighter-rouge">sequential</code> operators, see the <a href="#appendix-a">appendix</a> for a sketch of the translation.</p>

<p>I am not the only one to come up with this idea of course. I could for example find some similar things in the <a href="https://doc.qt.io/qt-5/qtquick-statesanimations-animations.html">Qt animation library</a> and <a href="https://www.renpy.org/doc/html/atl.html#parallel-statement">Ren’Py</a>. Even <a href="https://greensock.com/docs">GSAP</a>, which provides the callback-style, also provides a different feature for creating animations which they appropriately call <a href="https://greensock.com/get-started#sequencing-with-timelines">Timeline</a>. This feature is also based on the idea of describing timelines, similar to what <code class="language-plaintext highlighter-rouge">parallel</code>/<code class="language-plaintext highlighter-rouge">sequential</code> provide, and in the link they claim that ‘choreographing complex sequences is crazy simple’ with Timelines. What surprises me though, is that the approach isn’t the most prevalent way animations are expressed.</p>

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

<p>In conclusion, the main point I want to make is that I believe that the callback-style approach to describe animations does not seem like a good interface for animations. I argue this on the fact that it is not conducive to simple semantics of describing timelines, and by themselves the <code class="language-plaintext highlighter-rouge">onStart</code>/<code class="language-plaintext highlighter-rouge">onComplete</code> operators are less expressive than the <code class="language-plaintext highlighter-rouge">parallel</code>/<code class="language-plaintext highlighter-rouge">sequential</code> operators.</p>

<p>Have you ever used an animation library and felt something was off? Do you think of animations in terms of timelines? Or maybe you are a happy user of the callback-style and want to convince me of your ways? Feel free to discuss in the <a href="https://www.reddit.com/r/programming/comments/evt43d/parallelsequential_versus_onstartoncomplete">accompanying reddit thread</a>!</p>

<h1 id="appendix-a">Appendix A</h1>

<p>In this appendix I give an implementation of the <code class="language-plaintext highlighter-rouge">onStart</code>/<code class="language-plaintext highlighter-rouge">onComplete</code> operators based in terms of the <code class="language-plaintext highlighter-rouge">parallel</code>/<code class="language-plaintext highlighter-rouge">sequential</code> operators.</p>

<p>The translation is based on the idea that given a sequence of <code class="language-plaintext highlighter-rouge">onStart</code> and <code class="language-plaintext highlighter-rouge">onComplete</code> callbacks on an animation, we can always transform it to the form <code class="language-plaintext highlighter-rouge">(a sequential (.. parallel ..)) parallel (.. parallel ..)</code>. For example, if we have <code class="language-plaintext highlighter-rouge">((((a onStart b) onComplete c) onStart d) onComplete e) onStart f</code> then the timeline described by that expression is the same timeline as <code class="language-plaintext highlighter-rouge">(a sequential (c parallel e)) parallel (b parallel d parallel f)</code>.</p>

<center><img src="/assets/par-seq-1/appendix.png" /></center>

<p>In the translation, we ensure that everything is always of the form <code class="language-plaintext highlighter-rouge">(x1 sequential x2) parallel x3</code>, where <code class="language-plaintext highlighter-rouge">x1</code> is a basic animation. Then, we can describe the translation of each of the expressions in the callback-style DSL in function of the expressions in the combinator-style DSL. We do this by induction on the syntax definition.</p>

<center><img src="/assets/par-seq-1/appendix2.png" /></center>

<p>The translation of a <code class="language-plaintext highlighter-rouge">basic</code> expression requires us to put it in the required form. We do this by using a simple <code class="language-plaintext highlighter-rouge">noop</code> expression, which is a basic animation that takes 0 seconds and does not do anything. The translation is then: <code class="language-plaintext highlighter-rouge">basic = (basic sequential noop) parallel noop</code>.</p>

<p>The translation of an <code class="language-plaintext highlighter-rouge">x onStart y</code> expression requires us to make use of the fact that <code class="language-plaintext highlighter-rouge">x</code> has been transformed to the form <code class="language-plaintext highlighter-rouge">(x1 sequential x2) parallel x3</code>, in other words: we apply the induction hypothesis on <code class="language-plaintext highlighter-rouge">x</code>. The translation should then add <code class="language-plaintext highlighter-rouge">y</code> onto the animations that are in parallel with <code class="language-plaintext highlighter-rouge">x1</code>. The translation is: <code class="language-plaintext highlighter-rouge">(x1 sequential x2) parallel (x3 parallel y)</code>.</p>

<p>Similarly, for <code class="language-plaintext highlighter-rouge">x onComplete y</code> we deconstruct <code class="language-plaintext highlighter-rouge">x</code> and put <code class="language-plaintext highlighter-rouge">y</code> in parallel with the animations occurring after <code class="language-plaintext highlighter-rouge">x</code>. The translation is: <code class="language-plaintext highlighter-rouge">(x1 sequential (x2 parallel y)) parallel x3</code>.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Of course, to obtain a similar animation we can use <code class="language-plaintext highlighter-rouge">a onStart (b onComplete c)</code>. However, this is only possible if we know upfront that the animaton <code class="language-plaintext highlighter-rouge">b</code> is longer than animation <code class="language-plaintext highlighter-rouge">a</code>, and so this is not a general solution. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>In this section I am talking about the callback-style as defined here. In actual animation libraries, the syntax is not limited to the <code class="language-plaintext highlighter-rouge">onStart</code> and <code class="language-plaintext highlighter-rouge">onComplete</code> expression of course. For example, we usually also inherit <code class="language-plaintext highlighter-rouge">if then else</code> syntax from the host language. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>rubenpieters</name></author><category term="Programming" /><summary type="html"><![CDATA[In this post I give some thoughts on the use of parallel and sequential in favor of onStart and onComplete for an animation library. The reason why I think it is interesting to look at is because the latter seems to be much more common in many animation libraries such as for example anime.js, GSAP, Velocity.js or Phaser Tweens. However, as I have mentioned before, I am not very thrilled by this interface for animations. However, I wasn’t quite able to articulate my annoyance beyond a simple “I don’t really like it”. Since then, I think I have found a way to express what exactly is bothering me with this common approach to describe animations.]]></summary></entry><entry><title type="html">Animation DSL With Effect Handlers</title><link href="rubenpieters.github.io/programming/haskell/2019/07/09/animation-dsl-1.html" rel="alternate" type="text/html" title="Animation DSL With Effect Handlers" /><published>2019-07-09T00:00:00+00:00</published><updated>2019-07-09T00:00:00+00:00</updated><id>rubenpieters.github.io/programming/haskell/2019/07/09/animation-dsl-1</id><content type="html" xml:base="rubenpieters.github.io/programming/haskell/2019/07/09/animation-dsl-1.html"><![CDATA[<p>In this post we will take a look at a domain-specific language (DSL) for creating interactive and composable animations. At its core, the DSL is based on an effect handler (or free monad) approach with a slight twist. In addition to the <code class="language-plaintext highlighter-rouge">bind</code> and <code class="language-plaintext highlighter-rouge">return</code> combinators, we need a parallel combinator. We will take a look at some basic use cases and how the DSL is built from the ground up.</p>

<h1 id="history">History</h1>

<p>The DSL I will present in this post originated as a layer I created on top of tweening functionality provided by the <a href="https://phaser.io/">Phaser</a> game engine. By the way, the word <em>tweening</em> is short for <em>inbetweening</em>, <a href="https://en.wikipedia.org/wiki/Inbetweening">which means: generating frames inbetween two images to create the appearance of motion</a>. Anyway, the tweening API in Phaser provides the user with the ability to alter properties of objects over time. For example, let’s say we start with an object <code class="language-plaintext highlighter-rouge">obj = { x: 100, y: 100 }</code>. Then, we can attach a tween on <code class="language-plaintext highlighter-rouge">obj</code>, for example the tween object <code class="language-plaintext highlighter-rouge">tween.to({ x: 150 }, 200)</code>. By attaching this tween to <code class="language-plaintext highlighter-rouge">obj</code>, it will increase the property <code class="language-plaintext highlighter-rouge">obj.x</code> to <code class="language-plaintext highlighter-rouge">150</code> over the next 200 ms. There are various configuration parameters, such as different easing functions, to create all kinds of basic animations.</p>

<p>I use this to create various animations within a game prototype I am working on. The game features abilities with multiple effects which happen in sequence. When such an ability is activated, the animation for each of these effects needs to play in order. An animation for an effect can consist of various other animations in parallel. And what makes things even more complicated are statuses which intercept and alter effects, again with corresponding animations. This means that there are tons of animations that need to play in sequence or in parallel, and these are in turn composed of multiple animations playing in sequence or in parallel. Specifying this with the basic tweening interface was quite cumbersome, and so I started experimenting with this DSL on top of the more basic operations and have been very happy with it so far.</p>

<p>Now I want to take it a step further by porting the DSL to Haskell and looking at it from an effect handler perspective. We will be looking at the current iteration of the Haskell DSL in this post.</p>

<h1 id="overview">Overview</h1>

<p>First, let’s take a look at the very basics we want to achieve with the DSL: composing basic animations in sequence and in parallel. The post leaves out some code, but you can find the full example code in this <a href="https://github.com/rubenpieters/animation-dsl-examples">github repo</a>.</p>

<h2 id="basic-animations">Basic Animations</h2>

<p>As a first step, we need to specify what a basic animation is. We will model a basic animation consisting of three things. First, its <em>duration</em> specifies how many seconds the animation should last. Second, we provide a way to specify which values in our world model should change, we do this by passing a <em>traversal</em> since we can potentially focus on multiple values. Last, we provide the wanted <em>target value</em>, which tells us what the values focused on by the traversal should be at the end of the animation.</p>

<p><sup style="line-height:0.7"><sup>Note: Traversals are a concept from the various lens libraries. I will not go into detail on lenses in this post. I hope the use of lenses in this post is lightweight enough to understand from context what is going on even if you are not familiar with them. If you do want to read more about this, maybe this <a href="http://hackage.haskell.org/package/lens-tutorial-1.0.4/docs/Control-Lens-Tutorial.html">lens tutorial</a> can be of help.</sup></sup></p>

<p>Let’s say we want to create the animation of a box moving over the x-axis, we would create it as follows. We create a basic animation with a duration of <em>0.2</em> seconds, a traversal focusing on <em>sprites.box.x</em>, which is the x-value of the box object in the sprites of our world, and an end value of <em>50</em>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">basicBoxAnim</span> <span class="o">=</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">)</span>
</code></pre></div></div>

<p>This results in the following animation. Obviously, we are still missing some code to actually create these animations, but this gives an idea of what we are working towards.</p>

<center><img src="/assets/animation-dsl-1/basic.gif" /></center>

<h2 id="sequential-and-parallel-animations">Sequential and Parallel Animations</h2>

<p>The next steps in our DSL are sequential and parallel composition of animations.</p>

<p>First, let’s take a look at sequential composition. With the <code class="language-plaintext highlighter-rouge">seq</code> combinator, we can create an animation which consists of multiple basic animations executed sequentially. For example, if we wanted our box to walk a square path, we can create this by first creating an animation which increases the x value, then increases the y value, then decreases the x value and lastly decreases the y value. This animation is shown by means of code and a visual animation below.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">seqBoxAnim</span> <span class="o">=</span> <span class="n">seq</span>
  <span class="p">[</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">)</span>
  <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">)</span>
  <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">]</span>
</code></pre></div></div>

<center><img src="/assets/animation-dsl-1/seq.gif" /></center>

<p>We can also compose animations in parallel with the <code class="language-plaintext highlighter-rouge">par</code> combinator. For example, to create an animation of a box moving diagonally, we compose an animation of increasing x and increasing y in parallel. The code and visual are given below.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parBoxAnim</span> <span class="o">=</span> <span class="n">par</span>
  <span class="p">[</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">)</span>
  <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">)</span>
  <span class="p">]</span>
</code></pre></div></div>

<center><img src="/assets/animation-dsl-1/par.gif" /></center>

<h1 id="effect-dsl">Effect DSL</h1>

<p>Now, we will take a look at the internals of the DSL’s and build it from an effect handler perspective. When working in an effect handler setting, DSL’s are divided in two parts: the <em>operations</em> and the <em>combinators</em>. The former are the basic effects supported by our DSL, such as the <code class="language-plaintext highlighter-rouge">basic</code> animation effect. The latter represent the possibilities in which effects can be combined to create larger effects, such as the <code class="language-plaintext highlighter-rouge">seq</code> and <code class="language-plaintext highlighter-rouge">par</code> combinators. However, we will take the more well-known combinators <code class="language-plaintext highlighter-rouge">bind</code> and <code class="language-plaintext highlighter-rouge">return</code> as starting point, which makes our DSL a free monad.</p>

<h2 id="starting-point">Starting Point</h2>

<p>First, we have only one operation: <code class="language-plaintext highlighter-rouge">Basic</code>, which represents the effect of executing a basic animation. Notice that the <code class="language-plaintext highlighter-rouge">Ops</code> data type has a type parameter <code class="language-plaintext highlighter-rouge">a</code>. This type parameter represents the <em>return type</em> of the operation. The return type of the <code class="language-plaintext highlighter-rouge">Basic</code> operation is not very interesting, as it is unit. Later we will see an example with a more interesting return type.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- duration in s</span>
<span class="kr">newtype</span> <span class="kt">Duration</span> <span class="o">=</span> <span class="kt">For</span> <span class="kt">Float</span>

<span class="c1">-- end result value of animation</span>
<span class="kr">newtype</span> <span class="kt">To</span> <span class="o">=</span> <span class="kt">To</span> <span class="kt">Float</span>

<span class="kr">data</span> <span class="kt">Ops</span> <span class="n">obj</span> <span class="n">a</span> <span class="kr">where</span>
  <span class="kt">Basic</span> <span class="o">::</span> <span class="kt">Duration</span> <span class="o">-&gt;</span> <span class="kt">Traversal'</span> <span class="n">obj</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="kt">To</span> <span class="o">-&gt;</span> <span class="kt">Ops</span> <span class="n">obj</span> <span class="nb">()</span>
</code></pre></div></div>
<p>Next, we introduce the <code class="language-plaintext highlighter-rouge">Bind</code> and <code class="language-plaintext highlighter-rouge">Return</code> combinators. The <code class="language-plaintext highlighter-rouge">f</code> type parameter is a higher-kinded parameter where we will plug in <code class="language-plaintext highlighter-rouge">Ops obj</code> to create our actual DSL.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">a</span> <span class="kr">where</span>
  <span class="kt">Bind</span> <span class="o">::</span> <span class="n">f</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">Dsl</span> <span class="n">f</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">b</span>
  <span class="kt">Return</span> <span class="o">::</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">a</span>
</code></pre></div></div>

<p><sup style="line-height:0.7"><sup>Note: Intuitively speaking, this is a free monad because we obtain a free instance for the <code class="language-plaintext highlighter-rouge">Monad</code> typeclass. In this post we won’t delve deeper into the mathematical background of this data type. If you are interested in this, the <a href="http://hackage.haskell.org/package/free-5.1.1/docs/Control-Monad-Free.html#t:Free">free</a> package is a good starting point.</sup></sup></p>

<p>The return type of an operation is of importance in the <code class="language-plaintext highlighter-rouge">Bind</code> combinator. It takes as input an <code class="language-plaintext highlighter-rouge">f a</code>, or an effect from the operations <code class="language-plaintext highlighter-rouge">f</code> with a return type <code class="language-plaintext highlighter-rouge">a</code>, and a function <code class="language-plaintext highlighter-rouge">a -&gt; Dsl f b</code>, the remaining part of the effect which has to be executed after we have done the first operation. The <code class="language-plaintext highlighter-rouge">Return</code> combinator allows us to embed any value <code class="language-plaintext highlighter-rouge">a</code> as a no-op effect.</p>

<p>Creating a sequential animation with this encoding can be done as follows. We create a series of <code class="language-plaintext highlighter-rouge">Bind</code>s where we put a <code class="language-plaintext highlighter-rouge">Basic</code> animation as the first parameter and the remaining effects in the continuation function. These functions have unit as input value, since that is the return type of the <code class="language-plaintext highlighter-rouge">Basic</code> effect. So, we can implement the <code class="language-plaintext highlighter-rouge">seqBoxAnim</code> example like this:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">seqBoxAnim'</span> <span class="o">=</span>
  <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">))</span> <span class="o">$</span> <span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span>
  <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">))</span> <span class="o">$</span> <span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span>
  <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">0</span><span class="p">))</span> <span class="o">$</span> <span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span>
  <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">0</span><span class="p">))</span> <span class="o">$</span> <span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span>
  <span class="kt">Return</span> <span class="nb">()</span>
</code></pre></div></div>

<p>Or, we can implement the <code class="language-plaintext highlighter-rouge">seq</code> combinator in a generic fashion. This combinator takes a list of animations and creates an animation which executes them sequentially. This implementation uses the omitted <code class="language-plaintext highlighter-rouge">Monad</code> instance for <code class="language-plaintext highlighter-rouge">Dsl</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">seq</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="nb">()</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="nb">()</span>
<span class="n">seq</span> <span class="kt">[]</span> <span class="o">=</span> <span class="kt">Return</span> <span class="nb">()</span>
<span class="n">seq</span> <span class="p">(</span><span class="n">anim</span><span class="o">:</span><span class="n">r</span><span class="p">)</span> <span class="o">=</span> <span class="n">anim</span> <span class="o">&gt;&gt;=</span> <span class="p">(</span><span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span> <span class="n">seq</span> <span class="n">r</span><span class="p">)</span>
</code></pre></div></div>

<p>Combined with the following helper function for the <code class="language-plaintext highlighter-rouge">Basic</code> effect, we can then literally implement the first version of <code class="language-plaintext highlighter-rouge">seqBoxAnim</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">basic</span> <span class="o">::</span> <span class="kt">Duration</span> <span class="o">-&gt;</span> <span class="kt">Traversal'</span> <span class="n">obj</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="kt">To</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="nb">()</span>
<span class="n">basic</span> <span class="n">duration</span> <span class="n">traversal</span> <span class="n">to</span> <span class="o">=</span> <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="n">duration</span> <span class="n">traversal</span> <span class="n">to</span><span class="p">)</span> <span class="p">(</span><span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span> <span class="kt">Return</span> <span class="nb">()</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="par-combinator">Par Combinator</h2>

<p>We were able to support sequential animations out of the box with the free monad, but we are not able to support parallel animations. We might expect that we need to add an applicative combinator to our existing monad combinators. However, that only allows us to specify <em>parallel effects</em> (the <code class="language-plaintext highlighter-rouge">Ops</code> data type) as opposed to <em>parallel animations</em> (the <code class="language-plaintext highlighter-rouge">Dsl</code> data type). In essence, it is the difference between adding this combinator:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="kt">ParLimited</span> <span class="o">::</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="p">([</span><span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">b</span>
</code></pre></div></div>

<p>or this combinator:</p>

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

<p>Thus, the <code class="language-plaintext highlighter-rouge">Par</code> combinator takes as first argument a list of animations to execute in parallel. The second argument is a continuation which expects the return values of each of the animations executed in parallel.</p>

<p>So now our <code class="language-plaintext highlighter-rouge">Dsl</code> data type becomes:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">a</span> <span class="kr">where</span>
  <span class="kt">Bind</span> <span class="o">::</span> <span class="n">f</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">Dsl</span> <span class="n">f</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">b</span>
  <span class="kt">Return</span> <span class="o">::</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">a</span>
  <span class="kt">Par</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="n">f</span> <span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="p">([</span><span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="n">f</span> <span class="n">b</span>
</code></pre></div></div>

<p>With our shiny new combinator, we can support the first <code class="language-plaintext highlighter-rouge">parBoxAnim</code> example.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parBoxAnim'</span> <span class="o">=</span>
  <span class="kt">Par</span>
  <span class="p">[</span> <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.2</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">150</span><span class="p">))</span> <span class="p">(</span><span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span> <span class="kt">Return</span> <span class="nb">()</span><span class="p">)</span>
  <span class="p">,</span> <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.2</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">50</span><span class="p">))</span> <span class="p">(</span><span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span> <span class="kt">Return</span> <span class="nb">()</span><span class="p">)</span>
  <span class="p">]</span> <span class="o">$</span> <span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span>
  <span class="kt">Return</span> <span class="nb">()</span>
</code></pre></div></div>

<p>Or, we can implement the <code class="language-plaintext highlighter-rouge">par</code> combinator generically, which can again be used in combination with <code class="language-plaintext highlighter-rouge">basic</code> to allow the literal implementation of the earlier <code class="language-plaintext highlighter-rouge">parBoxAnim</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">par</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="nb">()</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="nb">()</span>
<span class="n">par</span> <span class="n">l</span> <span class="o">=</span> <span class="kt">Par</span> <span class="n">l</span> <span class="p">(</span><span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span> <span class="kt">Return</span> <span class="nb">()</span><span class="p">)</span>
</code></pre></div></div>

<h1 id="running-animations">Running Animations</h1>

<p>Now that we know how the DSL is implemented under the hood, we can take a look at how running animations actually works.</p>

<h2 id="applying-operations">Applying Operations</h2>

<p>First, we take a look at applying an operation to a world model, represented by the abstract type <code class="language-plaintext highlighter-rouge">obj</code>. The second parameter <code class="language-plaintext highlighter-rouge">t</code>, a <code class="language-plaintext highlighter-rouge">Float</code>, is the amount of time elapsed since the previous frame. The third and last parameter is the operation that we want to apply, of type <code class="language-plaintext highlighter-rouge">Ops obj a</code>. The output of the function is a tuple containing the new world model and either a new operation or a result value.</p>

<p>There is only one case to consider, the <code class="language-plaintext highlighter-rouge">Basic</code> operation. The function works as follows.</p>
<ol>
  <li>We update the value(s) within the world model based on the amount of elapsed time.</li>
  <li>We deduct the elapsed time from the remaining duration in the operation.</li>
  <li>If: The new remaining duration is greater than 0.
    <ul>
      <li>Then: Return a modified operation with the reduced duration.</li>
      <li>Else: Return a unit result.</li>
    </ul>
  </li>
</ol>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">applyOp</span> <span class="o">::</span> <span class="n">obj</span> <span class="o">-&gt;</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="kt">Ops</span> <span class="n">obj</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="kt">Either</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span> <span class="n">a</span><span class="p">)</span> <span class="n">a</span><span class="p">)</span>
<span class="n">applyOp</span> <span class="n">obj</span> <span class="n">t</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="n">duration</span><span class="p">)</span> <span class="n">traversal</span> <span class="p">(</span><span class="kt">To</span> <span class="n">x</span><span class="p">))</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="c1">-- (1) update world model values</span>
  <span class="n">newObj</span> <span class="o">=</span> <span class="n">obj</span> <span class="o">&amp;</span> <span class="n">traversal</span> <span class="o">%~</span> <span class="n">updateValue</span> <span class="n">t</span> <span class="n">duration</span> <span class="n">x</span>
  <span class="c1">-- (2) reduce duration</span>
  <span class="n">newDuration</span> <span class="o">=</span> <span class="n">duration</span> <span class="o">-</span> <span class="n">t</span>
  <span class="c1">-- (3) create new animation/result</span>
  <span class="n">result</span> <span class="o">=</span> <span class="kr">if</span> <span class="n">newDuration</span> <span class="o">&gt;</span> <span class="mi">0</span>
    <span class="kr">then</span> <span class="kt">Left</span> <span class="p">(</span><span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="n">newDuration</span><span class="p">)</span> <span class="n">traversal</span> <span class="p">(</span><span class="kt">To</span> <span class="n">x</span><span class="p">))</span>
    <span class="kr">else</span> <span class="kt">Right</span> <span class="nb">()</span>
  <span class="kr">in</span> <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
</code></pre></div></div>

<p>This is the <code class="language-plaintext highlighter-rouge">updateValue</code> helper function to update a value within the world model. The value is clamped to make sure we don’t overshoot. There might be some numerical instability in the way this is calculated, but I haven’t properly tested this yet.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">updateValue</span> <span class="o">::</span>
  <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="c1">-- time elapsed</span>
  <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="c1">-- duration</span>
  <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="c1">-- target value</span>
  <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="c1">-- current value</span>
  <span class="kt">Float</span> <span class="c1">-- new value</span>
<span class="n">updateValue</span> <span class="n">t</span> <span class="n">duration</span> <span class="n">target</span> <span class="n">current</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">newValue</span> <span class="o">=</span> <span class="p">(</span><span class="n">current</span> <span class="o">+</span> <span class="p">((</span><span class="n">target</span> <span class="o">-</span> <span class="n">current</span><span class="p">)</span> <span class="o">*</span> <span class="n">t</span><span class="p">)</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
  <span class="kr">in</span> <span class="kr">if</span> <span class="n">target</span> <span class="o">&gt;</span> <span class="n">current</span>
    <span class="kr">then</span> <span class="n">min</span> <span class="n">target</span> <span class="n">newValue</span>
    <span class="kr">else</span> <span class="n">max</span> <span class="n">target</span> <span class="n">newValue</span>
</code></pre></div></div>

<p>We can test this function on a simple example. We will start with <code class="language-plaintext highlighter-rouge">(100, 100)</code> as our world model and apply an animation which changes the first value to <code class="language-plaintext highlighter-rouge">150</code>. We end up with a world model of <code class="language-plaintext highlighter-rouge">(150, 100)</code> after applying the animation fully, as we expect.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- our world model</span>
<span class="n">example1_state</span> <span class="o">::</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">)</span>
<span class="n">example1_state</span> <span class="o">=</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>

<span class="c1">-- a basic animation</span>
<span class="n">example1_anim</span> <span class="o">::</span> <span class="kt">Ops</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">)</span> <span class="nb">()</span>
<span class="n">example1_anim</span> <span class="o">=</span> <span class="kt">Basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.2</span><span class="p">)</span> <span class="n">_1</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">150</span><span class="p">)</span>

<span class="c1">-- after 1 operation step</span>
<span class="n">example1_1</span> <span class="o">::</span> <span class="p">((</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">),</span> <span class="kt">Either</span> <span class="p">(</span><span class="kt">Ops</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">)</span> <span class="nb">()</span><span class="p">)</span> <span class="nb">()</span><span class="p">)</span>
<span class="n">example1_1</span> <span class="o">=</span> <span class="n">applyOp</span> <span class="p">(</span><span class="n">example1_state</span><span class="p">)</span> <span class="mf">0.1</span> <span class="n">example1_anim</span>
<span class="c1">-- ((125.0,100.0),Left Basic (For 0.1) (At ...) (To 150.0))</span>

<span class="c1">-- after 2 operation steps</span>
<span class="n">example1_2</span> <span class="o">::</span> <span class="p">((</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">),</span> <span class="kt">Either</span> <span class="p">(</span><span class="kt">Ops</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">)</span> <span class="nb">()</span><span class="p">)</span> <span class="nb">()</span><span class="p">)</span>
<span class="n">example1_2</span> <span class="o">=</span> <span class="n">applyOp</span> <span class="p">(</span><span class="n">fst</span> <span class="n">example1_1</span><span class="p">)</span> <span class="mf">0.1</span> <span class="p">(</span><span class="n">fromLeft</span> <span class="n">undefined</span> <span class="p">(</span><span class="n">snd</span> <span class="n">example1_1</span><span class="p">))</span>
<span class="c1">-- ((150.0,100.0),Right ())</span>
</code></pre></div></div>

<h2 id="applying-animations">Applying Animations</h2>

<p>Next, we need to be able to apply a complete animation to a world model. We again take an <code class="language-plaintext highlighter-rouge">obj</code> and <code class="language-plaintext highlighter-rouge">Float</code> as parameter and a <code class="language-plaintext highlighter-rouge">Dsl (Anim obj) a</code> representing the animation. As a result, we obtain the modified world model and animation.</p>

<p>Essentially, how the <code class="language-plaintext highlighter-rouge">applyDsl</code> function works is that we apply the operations to the world model and replace the newly obtained animations inside the combinators. If the operations have returned a result when they are finished, we apply their results to the continuation in the combinators.</p>

<p>We take a more in-depth look to the function here. There are three cases to consider:</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">Bind</code>: We apply the animation within the <code class="language-plaintext highlighter-rouge">Bind</code> combinator with <code class="language-plaintext highlighter-rouge">applyOp</code>. This can have two outcomes:
    <ul>
      <li>We obtain a result value, we can apply this value to the continuation inside the <code class="language-plaintext highlighter-rouge">Bind</code> combinator to obtain the new animation.</li>
      <li>We obtain a new animation, which replaces the animation in the previous <code class="language-plaintext highlighter-rouge">Bind</code> combinator.</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">Par</code>: We apply all of the operations in the <code class="language-plaintext highlighter-rouge">Par</code> combinator. Then, we check whether all values after this step are <code class="language-plaintext highlighter-rouge">Return</code> values.
    <ul>
      <li>If that is the case, we can apply the those values to the continuation within the <code class="language-plaintext highlighter-rouge">Par</code> constructor.</li>
      <li>If that is not the case, we replace the operations inside the <code class="language-plaintext highlighter-rouge">Par</code> combinator.</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">Return</code>: We don’t modify the object or the animation, since the animation is finished.</li>
</ol>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">applyDsl</span> <span class="o">::</span> <span class="n">obj</span> <span class="o">-&gt;</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="n">a</span><span class="p">)</span>
<span class="c1">-- (1) Bind case</span>
<span class="n">applyDsl</span> <span class="n">obj</span> <span class="n">t</span> <span class="p">(</span><span class="kt">Bind</span> <span class="n">fa</span> <span class="n">k</span><span class="p">)</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="n">eResult</span><span class="p">)</span> <span class="o">=</span> <span class="n">applyOp</span> <span class="n">obj</span> <span class="n">t</span> <span class="n">fa</span>
  <span class="kr">in</span> <span class="kr">case</span> <span class="n">eResult</span> <span class="kr">of</span>
    <span class="kt">Right</span> <span class="n">result</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="n">k</span> <span class="n">result</span><span class="p">)</span>
    <span class="kt">Left</span> <span class="n">newOp</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="kt">Bind</span> <span class="n">newOp</span> <span class="n">k</span><span class="p">)</span>
<span class="c1">-- (2) Par case</span>
<span class="n">applyDsl</span> <span class="n">obj</span> <span class="n">t</span> <span class="p">(</span><span class="kt">Par</span> <span class="n">fs</span> <span class="n">k</span><span class="p">)</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="n">newOps</span><span class="p">)</span> <span class="o">=</span> <span class="n">applyOps</span> <span class="n">obj</span> <span class="n">t</span> <span class="n">fs</span>
  <span class="kr">in</span> <span class="kr">case</span> <span class="n">returnValues</span> <span class="n">newOps</span> <span class="kr">of</span>
    <span class="kt">Right</span> <span class="n">l</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="n">k</span> <span class="n">l</span><span class="p">)</span>
    <span class="kt">Left</span> <span class="nb">()</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">newObj</span><span class="p">,</span> <span class="kt">Par</span> <span class="n">newOps</span> <span class="n">k</span><span class="p">)</span>
<span class="c1">-- (3) Return case</span>
<span class="n">applyDsl</span> <span class="n">obj</span> <span class="n">t</span> <span class="p">(</span><span class="kt">Return</span> <span class="n">a</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="kt">Return</span> <span class="n">a</span><span class="p">)</span>
</code></pre></div></div>

<p>The helper functions <code class="language-plaintext highlighter-rouge">applyOps</code> and <code class="language-plaintext highlighter-rouge">returnValues</code> are given below. The former applies all the operations in a list to the given world model and keeps track of the final modified world model and new operations. The latter gathers all <code class="language-plaintext highlighter-rouge">Return</code> values in a list, but returns <code class="language-plaintext highlighter-rouge">Left ()</code> if there was a non-<code class="language-plaintext highlighter-rouge">Return</code> value.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">applyOps</span> <span class="o">::</span> <span class="n">obj</span> <span class="o">-&gt;</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="n">a</span><span class="p">])</span>
<span class="n">applyOps</span> <span class="n">obj</span> <span class="n">t</span> <span class="kt">[]</span> <span class="o">=</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="kt">[]</span><span class="p">)</span>
<span class="n">applyOps</span> <span class="n">obj</span> <span class="n">t</span> <span class="p">(</span><span class="n">op</span><span class="o">:</span><span class="n">r</span><span class="p">)</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="c1">-- apply first operation</span>
  <span class="p">(</span><span class="n">obj'</span><span class="p">,</span> <span class="n">op'</span><span class="p">)</span> <span class="o">=</span> <span class="n">applyDsl</span> <span class="n">obj</span> <span class="n">t</span> <span class="n">op</span>
  <span class="c1">-- apply the rest of the operations</span>
  <span class="p">(</span><span class="n">obj''</span><span class="p">,</span> <span class="n">ops</span><span class="p">)</span> <span class="o">=</span> <span class="n">applyOps</span> <span class="n">obj'</span> <span class="n">t</span> <span class="n">r</span>
  <span class="kr">in</span> <span class="p">(</span><span class="n">obj''</span><span class="p">,</span> <span class="n">op'</span> <span class="o">:</span> <span class="n">ops</span><span class="p">)</span>

<span class="n">returnValues</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="n">f</span> <span class="n">a</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="kt">Either</span> <span class="nb">()</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span>
<span class="n">returnValues</span> <span class="kt">[]</span> <span class="o">=</span> <span class="kt">Right</span> <span class="kt">[]</span>
<span class="n">returnValues</span> <span class="p">((</span><span class="kt">Return</span> <span class="n">a</span><span class="p">)</span><span class="o">:</span><span class="n">r</span><span class="p">)</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="n">l</span> <span class="o">&lt;-</span> <span class="n">returnValues</span> <span class="n">r</span>
  <span class="n">return</span> <span class="p">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">l</span><span class="p">)</span>
<span class="n">returnValues</span> <span class="kr">_</span> <span class="o">=</span> <span class="kt">Left</span> <span class="nb">()</span>
</code></pre></div></div>

<p>We can take out our tuple world model example again, and apply a simple parallel animation to it to check that it works as we expect.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- our world model</span>
<span class="n">example2_state</span> <span class="o">::</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">)</span>
<span class="n">example2_state</span> <span class="o">=</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>

<span class="c1">-- a composed animation</span>
<span class="n">example2_anim</span> <span class="o">::</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">))</span> <span class="nb">()</span>
<span class="n">example2_anim</span> <span class="o">=</span>
  <span class="n">par</span>
  <span class="p">[</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.2</span><span class="p">)</span> <span class="n">_1</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">150</span><span class="p">)</span>
  <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.2</span><span class="p">)</span> <span class="n">_2</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">150</span><span class="p">)</span>
  <span class="p">]</span>

<span class="c1">-- after 1 dsl step</span>
<span class="n">example2_1</span> <span class="o">::</span> <span class="p">((</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">),</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">))</span> <span class="nb">()</span><span class="p">)</span>
<span class="n">example2_1</span> <span class="o">=</span> <span class="n">applyDsl</span> <span class="n">example2_state</span> <span class="mf">0.1</span> <span class="n">example2_anim</span>
<span class="c1">-- Note that the 0.2 values inside the animation are reduced to 0.1</span>
<span class="cm">{-
( (125.0,125.0)
, Par (
    [ Bind (Basic (For 0.1) (At ...) (To 150.0)) (Return)
    , Bind (Basic (For 0.1) (At ...) (To 150.0)) (Return)]
  ) (Return)
)
-}</span>

<span class="c1">-- after 2 dsl steps</span>
<span class="n">example2_2</span> <span class="o">::</span> <span class="p">((</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">),</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="p">(</span><span class="kt">Float</span><span class="p">,</span> <span class="kt">Float</span><span class="p">))</span> <span class="nb">()</span><span class="p">)</span>
<span class="n">example2_2</span> <span class="o">=</span> <span class="n">applyDsl</span> <span class="p">(</span><span class="n">fst</span> <span class="n">example2_1</span><span class="p">)</span> <span class="mf">0.1</span> <span class="p">(</span><span class="n">snd</span> <span class="n">example2_1</span><span class="p">)</span>
<span class="c1">-- ((150.0,150.0),Return)</span>
</code></pre></div></div>

<h2 id="gluing-with-gloss">Gluing with Gloss</h2>

<p>At this point, we have seen enough to be able to glue everything up to the <a href="http://hackage.haskell.org/package/gloss">gloss</a> package and actually create some animations.</p>

<p>First, we will define the representation of our world model in the following data types. The <code class="language-plaintext highlighter-rouge">Sprite</code> data type contains a gloss <code class="language-plaintext highlighter-rouge">Picture</code> and some additional information on how to draw it. Then we have the collection of sprites in the <code class="language-plaintext highlighter-rouge">Sprites</code> data type. And lastly, we have the <code class="language-plaintext highlighter-rouge">World</code> data type which contains the sprites and the currently running animations. We also create lenses for all these data types.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kr">data</span> <span class="kt">Sprite</span>
  <span class="o">=</span> <span class="kt">Sprite</span>
  <span class="p">{</span> <span class="n">_x</span> <span class="o">::</span> <span class="kt">Float</span>
  <span class="p">,</span> <span class="n">_y</span> <span class="o">::</span> <span class="kt">Float</span>
  <span class="p">,</span> <span class="n">_alpha</span> <span class="o">::</span> <span class="kt">Float</span>
  <span class="p">,</span> <span class="n">_scale</span> <span class="o">::</span> <span class="kt">Float</span>
  <span class="p">,</span> <span class="n">_picture</span> <span class="o">::</span> <span class="kt">Picture</span>
  <span class="p">}</span>

<span class="n">makeLenses</span> <span class="n">''Sprite</span>

<span class="kr">data</span> <span class="kt">Sprites</span>
  <span class="o">=</span> <span class="kt">Sprites</span>
  <span class="p">{</span> <span class="n">_box</span> <span class="o">::</span> <span class="kt">Sprite</span>
  <span class="p">}</span>

<span class="n">makeLenses</span> <span class="n">''Sprites</span>

<span class="n">allSprites</span> <span class="o">::</span> <span class="kt">Sprites</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Sprite</span><span class="p">]</span>
<span class="n">allSprites</span> <span class="p">(</span><span class="kt">Sprites</span> <span class="n">box</span><span class="p">)</span> <span class="o">=</span> <span class="p">[</span><span class="n">box</span><span class="p">]</span>

<span class="kr">data</span> <span class="kt">World</span>
  <span class="o">=</span> <span class="kt">World</span>
  <span class="p">{</span> <span class="n">_sprites</span> <span class="o">::</span> <span class="kt">Sprites</span>
  <span class="p">,</span> <span class="n">_runningAnimations</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="kt">World</span><span class="p">)</span> <span class="nb">()</span><span class="p">]</span>
  <span class="p">}</span>

<span class="n">makeLenses</span> <span class="n">''World</span>
</code></pre></div></div>

<p>Next, we need various functions which will be passed to the gloss entrypoint. <code class="language-plaintext highlighter-rouge">drawSprite</code> takes a <code class="language-plaintext highlighter-rouge">Sprite</code> and returns a <code class="language-plaintext highlighter-rouge">Picture</code>. The <code class="language-plaintext highlighter-rouge">draw</code> function takes a world and creates a picture from it, essentially combining all sprites converted into a <code class="language-plaintext highlighter-rouge">Picture</code> into one. The <code class="language-plaintext highlighter-rouge">handleInput</code> function will add an animation to the world when the <strong>x</strong> key is pressed. The <code class="language-plaintext highlighter-rouge">update</code> function updates the world model based on the currently running animations. Then we define an initial world model and pass everything into the gloss <code class="language-plaintext highlighter-rouge">play</code> function.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">drawSprite</span> <span class="o">::</span> <span class="kt">Sprite</span> <span class="o">-&gt;</span> <span class="kt">Picture</span>
<span class="n">drawSprite</span> <span class="p">(</span><span class="kt">Sprite</span> <span class="p">{</span><span class="n">_x</span><span class="p">,</span> <span class="n">_y</span><span class="p">,</span> <span class="n">_alpha</span><span class="p">,</span> <span class="n">_scale</span><span class="p">,</span> <span class="n">_picture</span><span class="p">})</span> <span class="o">=</span>
  <span class="n">_picture</span> <span class="o">&amp;</span>
  <span class="kt">Color</span> <span class="p">(</span><span class="n">makeColor</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="n">_alpha</span><span class="p">)</span> <span class="o">&amp;</span>
  <span class="kt">Scale</span> <span class="n">_scale</span> <span class="n">_scale</span> <span class="o">&amp;</span>
  <span class="kt">Translate</span> <span class="n">_x</span> <span class="n">_y</span>

<span class="n">draw</span> <span class="o">::</span> <span class="kt">World</span> <span class="o">-&gt;</span> <span class="kt">Picture</span>
<span class="n">draw</span> <span class="p">(</span><span class="kt">World</span> <span class="p">{</span><span class="n">_sprites</span><span class="p">})</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">worldSprites</span> <span class="o">=</span> <span class="n">allSprites</span> <span class="n">_sprites</span>
  <span class="kr">in</span> <span class="kt">Pictures</span> <span class="p">(</span><span class="n">map</span> <span class="n">drawSprite</span> <span class="n">worldSprites</span><span class="p">)</span>

<span class="n">handleInput</span> <span class="o">::</span> <span class="kt">Event</span> <span class="o">-&gt;</span> <span class="kt">World</span> <span class="o">-&gt;</span> <span class="kt">World</span>
<span class="n">handleInput</span> <span class="p">(</span><span class="kt">EventKey</span> <span class="p">(</span><span class="kt">Char</span> <span class="sc">'x'</span><span class="p">)</span> <span class="kt">Down</span> <span class="kr">_</span> <span class="kr">_</span><span class="p">)</span> <span class="n">w</span><span class="o">@</span><span class="p">(</span><span class="kt">World</span> <span class="p">{</span><span class="n">_runningAnimations</span><span class="p">})</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">newRAnims</span> <span class="o">=</span> <span class="n">_runningAnimations</span> <span class="o">++</span> <span class="p">[</span><span class="n">fancyBoxAnim</span><span class="p">]</span>
  <span class="kr">in</span> <span class="n">w</span> <span class="p">{</span> <span class="n">_runningAnimations</span> <span class="o">=</span> <span class="n">newRAnims</span> <span class="p">}</span>
<span class="n">handleInput</span> <span class="kr">_</span> <span class="n">w</span> <span class="o">=</span> <span class="n">w</span>

<span class="n">update</span> <span class="o">::</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="kt">World</span> <span class="o">-&gt;</span> <span class="kt">World</span>
<span class="n">update</span> <span class="n">t</span> <span class="n">w</span><span class="o">@</span><span class="p">(</span><span class="kt">World</span> <span class="p">{</span><span class="n">_runningAnimations</span><span class="p">})</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="p">(</span><span class="n">newWorld</span><span class="p">,</span> <span class="n">newOps</span><span class="p">)</span> <span class="o">=</span> <span class="n">applyOps</span> <span class="n">w</span> <span class="n">t</span> <span class="n">_runningAnimations</span>
  <span class="n">f</span> <span class="p">(</span><span class="kt">Return</span> <span class="kr">_</span><span class="p">)</span> <span class="o">=</span> <span class="kt">False</span>
  <span class="n">f</span> <span class="kr">_</span> <span class="o">=</span> <span class="kt">True</span>
  <span class="n">filteredOps</span> <span class="o">=</span> <span class="n">filter</span> <span class="n">f</span> <span class="n">newOps</span>
  <span class="kr">in</span> <span class="n">newWorld</span> <span class="p">{</span> <span class="n">_runningAnimations</span> <span class="o">=</span> <span class="n">filteredOps</span> <span class="p">}</span>

<span class="n">boxPic</span> <span class="o">::</span> <span class="kt">Picture</span>
<span class="n">boxPic</span> <span class="o">=</span> <span class="kt">Pictures</span>
  <span class="p">[</span> <span class="kt">Line</span> <span class="p">[(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</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="p">,</span> <span class="kt">Line</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="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)]</span>
  <span class="p">,</span> <span class="kt">Line</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</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">-</span><span class="mi">1</span><span class="p">)]</span>
  <span class="p">,</span> <span class="kt">Line</span> <span class="p">[(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
  <span class="p">]</span>

<span class="n">initialWorld</span> <span class="o">::</span> <span class="kt">World</span>
<span class="n">initialWorld</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">worldSprites</span> <span class="o">=</span> <span class="kt">Sprites</span> <span class="p">(</span><span class="kt">Sprite</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">20</span> <span class="n">boxPic</span><span class="p">)</span>
  <span class="kr">in</span> <span class="kt">World</span> <span class="n">worldSprites</span> <span class="kt">[]</span>

<span class="n">main</span> <span class="o">::</span> <span class="kt">IO</span> <span class="nb">()</span>
<span class="n">main</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">window</span> <span class="o">=</span> <span class="kt">InWindow</span> <span class="s">"animation-dsl"</span> <span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="mi">400</span><span class="p">)</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
  <span class="kr">in</span> <span class="n">play</span> <span class="n">window</span> <span class="n">black</span> <span class="mi">60</span> <span class="n">initialWorld</span> <span class="n">draw</span> <span class="n">handleInput</span> <span class="n">update</span>
</code></pre></div></div>

<p>As a last example let’s take a look at a more complicated animation. This animation is similar to the square path animation, but in parallel the box will fade in and out.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fancyBoxAnim</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">fade</span> <span class="o">=</span> <span class="n">seq</span>
    <span class="p">[</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.125</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">alpha</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.125</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">box</span> <span class="o">.</span> <span class="n">alpha</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">1</span><span class="p">)</span>
    <span class="p">]</span>
  <span class="kr">in</span> <span class="n">par</span>
  <span class="p">[</span> <span class="n">seqBoxAnim</span>
  <span class="p">,</span> <span class="n">seq</span> <span class="p">(</span><span class="n">replicate</span> <span class="mi">8</span> <span class="n">fade</span><span class="p">)</span>
  <span class="p">]</span>
</code></pre></div></div>

<center><img src="/assets/animation-dsl-1/fancy.gif" /></center>

<h1 id="create-effect">Create Effect</h1>

<p>So far we have created animations using only the <code class="language-plaintext highlighter-rouge">Basic</code> effect. However, there are other interesting effects we can add to the DSL. In this section we will look at the <code class="language-plaintext highlighter-rouge">Create</code> effect, which creates an object within the world model.</p>

<p>To add an effect to our DSL, we have to update the <code class="language-plaintext highlighter-rouge">Ops</code> data type definition. The <code class="language-plaintext highlighter-rouge">Create</code> effect will take as input a function on how to create an object. Then, we also need to know how to access this object later on in the animation, so this function returns an integer index. This index is also the return type of the effect, note that the <code class="language-plaintext highlighter-rouge">Create</code> constructor constructs a value of type <code class="language-plaintext highlighter-rouge">Anim obj Int</code>. This means that this operation has an <code class="language-plaintext highlighter-rouge">Int</code> as result type.</p>

<p>The updated <code class="language-plaintext highlighter-rouge">Ops</code> declaration is given below.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Ops</span> <span class="n">obj</span> <span class="n">a</span> <span class="kr">where</span>
  <span class="kt">Basic</span> <span class="o">::</span> <span class="kt">Duration</span> <span class="o">-&gt;</span> <span class="kt">Traversal'</span> <span class="n">obj</span> <span class="kt">Float</span> <span class="o">-&gt;</span> <span class="kt">To</span> <span class="o">-&gt;</span> <span class="kt">Ops</span> <span class="n">obj</span> <span class="nb">()</span>
  <span class="kt">Create</span> <span class="o">::</span> <span class="p">(</span><span class="n">obj</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="kt">Int</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="kt">Ops</span> <span class="n">obj</span> <span class="kt">Int</span>
</code></pre></div></div>

<p>By adding this constructor, we also have to add a clause to the <code class="language-plaintext highlighter-rouge">applyOp</code> function. The implementation is quite easy, we call the <code class="language-plaintext highlighter-rouge">create</code> function inside the <code class="language-plaintext highlighter-rouge">Create</code> constructor and pass the obtained data along.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">applyOp</span> <span class="n">obj</span> <span class="n">t</span> <span class="p">(</span><span class="kt">Create</span> <span class="n">create</span><span class="p">)</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="p">(</span><span class="n">createdObj</span><span class="p">,</span> <span class="n">objIndex</span><span class="p">)</span> <span class="o">=</span> <span class="n">create</span> <span class="n">obj</span>
  <span class="kr">in</span> <span class="p">(</span><span class="n">createdObj</span><span class="p">,</span> <span class="kt">Right</span> <span class="n">objIndex</span><span class="p">)</span>
</code></pre></div></div>

<p>And we can again create a helper function <code class="language-plaintext highlighter-rouge">create</code> for convenience.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">create</span> <span class="o">::</span> <span class="p">(</span><span class="n">obj</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="kt">Int</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="n">obj</span><span class="p">)</span> <span class="kt">Int</span>
<span class="n">create</span> <span class="n">create</span> <span class="o">=</span> <span class="kt">Bind</span> <span class="p">(</span><span class="kt">Create</span> <span class="n">create</span><span class="p">)</span> <span class="p">(</span><span class="nf">\</span><span class="n">index</span> <span class="o">-&gt;</span> <span class="kt">Return</span> <span class="n">index</span><span class="p">)</span>
</code></pre></div></div>

<p>For the following animation we make a small update to our <code class="language-plaintext highlighter-rouge">World</code> data type. The <code class="language-plaintext highlighter-rouge">_sprites</code> field is now a list of sprites, so it can host a dynamic amount of sprites.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">World</span>
  <span class="o">=</span> <span class="kt">World</span>
  <span class="p">{</span> <span class="n">_sprites</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Sprite</span><span class="p">]</span>
  <span class="p">,</span> <span class="n">_runningAnimations</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="kt">World</span><span class="p">)</span> <span class="nb">()</span><span class="p">]</span>
  <span class="p">}</span>
</code></pre></div></div>

<p>The following animation uses the <code class="language-plaintext highlighter-rouge">create</code> effect to create a new box in the world and play a little animation along with it.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">createBox</span> <span class="o">::</span> <span class="kt">World</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">World</span><span class="p">,</span> <span class="kt">Int</span><span class="p">)</span>
<span class="n">createBox</span> <span class="n">w</span><span class="o">@</span><span class="p">(</span><span class="kt">World</span> <span class="p">{</span><span class="n">_sprites</span><span class="p">})</span> <span class="o">=</span> <span class="kr">let</span>
  <span class="n">newIndex</span> <span class="o">=</span> <span class="n">w</span> <span class="o">^.</span> <span class="n">sprites</span> <span class="o">&amp;</span> <span class="n">length</span>
  <span class="n">sprite</span> <span class="o">=</span> <span class="kt">Sprite</span> <span class="p">((</span><span class="o">-</span><span class="mi">120</span><span class="p">)</span> <span class="o">+</span> <span class="n">fromIntegral</span> <span class="n">newIndex</span> <span class="o">*</span> <span class="mi">60</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">30</span> <span class="n">boxPic</span>
  <span class="n">newWorld</span> <span class="o">=</span> <span class="n">w</span> <span class="p">{</span> <span class="n">_sprites</span> <span class="o">=</span> <span class="n">_sprites</span> <span class="o">++</span> <span class="p">[</span><span class="n">sprite</span><span class="p">]</span> <span class="p">}</span>
  <span class="kr">in</span> <span class="p">(</span><span class="n">newWorld</span><span class="p">,</span> <span class="n">newIndex</span><span class="p">)</span>

<span class="n">atIndex</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Lens'</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="n">a</span>
<span class="n">atIndex</span> <span class="n">i</span> <span class="o">=</span> <span class="n">lens</span> <span class="p">(</span><span class="o">!!</span> <span class="n">i</span><span class="p">)</span> <span class="p">(</span><span class="nf">\</span><span class="n">s</span> <span class="n">b</span> <span class="o">-&gt;</span> <span class="n">take</span> <span class="n">i</span> <span class="n">s</span> <span class="o">++</span> <span class="n">b</span> <span class="o">:</span> <span class="n">drop</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="n">s</span><span class="p">)</span>

<span class="n">createBoxAnim</span> <span class="o">::</span> <span class="kt">Dsl</span> <span class="p">(</span><span class="kt">Ops</span> <span class="kt">World</span><span class="p">)</span> <span class="nb">()</span>
<span class="n">createBoxAnim</span> <span class="o">=</span> <span class="kr">do</span>
  <span class="n">i</span> <span class="o">&lt;-</span> <span class="n">create</span> <span class="n">createBox</span>
  <span class="n">par</span>
    <span class="p">[</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">atIndex</span> <span class="n">i</span> <span class="o">.</span> <span class="n">alpha</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">1</span><span class="p">)</span>
    <span class="p">,</span> <span class="n">basic</span> <span class="p">(</span><span class="kt">For</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">(</span><span class="n">sprites</span> <span class="o">.</span> <span class="n">atIndex</span> <span class="n">i</span> <span class="o">.</span> <span class="n">scale</span><span class="p">)</span> <span class="p">(</span><span class="kt">To</span> <span class="mi">20</span><span class="p">)</span>
    <span class="p">]</span>
</code></pre></div></div>

<p>This results in the animation below, each new box appearing happens after a key is pressed.</p>

<center><img src="/assets/animation-dsl-1/create.gif" /></center>

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

<p>We looked at building an animation DSL from the ground up, starting from a traditional effect handler perspective. We extended this with the <code class="language-plaintext highlighter-rouge">Par</code> combinator for parallel animations, created visual animations using the gloss library and added an extra <code class="language-plaintext highlighter-rouge">create</code> operation.</p>

<p>One main future direction I want to explore is converting it into a modular effects approach. This allows an end user to mix and match whatever basic effects they want in the DSL. For example, an effect they might want to add is playing sounds during an animation, or maybe hook into game engine primitives such as certain shaders (de)activating. These additional effects can be dependent on how the user wants to use the DSL, and so a modular approach seems appropriate.</p>

<p>Feel free to post any interesting ideas or feedback in the accompanying <a href="https://www.reddit.com/r/haskell/comments/cb1qs6/animation_dsl_with_effect_handlers">reddit thread</a>!</p>]]></content><author><name>rubenpieters</name></author><category term="Programming" /><category term="Haskell" /><summary type="html"><![CDATA[In this post we will take a look at a domain-specific language (DSL) for creating interactive and composable animations. At its core, the DSL is based on an effect handler (or free monad) approach with a slight twist. In addition to the bind and return combinators, we need a parallel combinator. We will take a look at some basic use cases and how the DSL is built from the ground up.]]></summary></entry><entry><title type="html">Encoding Existential Types In TypeScript</title><link href="rubenpieters.github.io/programming/typescript/2018/07/13/existential-types-typescript.html" rel="alternate" type="text/html" title="Encoding Existential Types In TypeScript" /><published>2018-07-13T00:00:00+00:00</published><updated>2018-07-13T00:00:00+00:00</updated><id>rubenpieters.github.io/programming/typescript/2018/07/13/existential-types-typescript</id><content type="html" xml:base="rubenpieters.github.io/programming/typescript/2018/07/13/existential-types-typescript.html"><![CDATA[<p>In this post we will take a look at a use case where the encoding for existential types helped me create a small utility wrapper for the <a href="https://github.com/engineforce/ImmutableAssign"><code class="language-plaintext highlighter-rouge">immutable-assign</code></a> library.</p>

<h1 id="the-what">The What</h1>

<p>I have been using immutable-assign for updating immutable datastructures. This library provides the function <code class="language-plaintext highlighter-rouge">iassign</code> for deep immutable update on plain javascript objects. For example, if we have <code class="language-plaintext highlighter-rouge">x = { a: { b: 1 } }</code> then we can use <code class="language-plaintext highlighter-rouge">iassign(x, x =&gt; x.a.b, x =&gt; 5)</code> to obtain <code class="language-plaintext highlighter-rouge">{ a: { b: 5 } }</code> without mutating <code class="language-plaintext highlighter-rouge">x</code>.</p>

<p>However, one thing that had been bothering me is updating multiple properties in one go. For example, if we want to update all values in <code class="language-plaintext highlighter-rouge">{ a: { b: 1, c: 2}, d: 3 }</code> by 1. Then we have to do:</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">iassign</span><span class="p">(</span><span class="nx">iassign</span><span class="p">(</span><span class="nx">iassign</span><span class="p">(</span>
  <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="mi">2</span> <span class="p">},</span> <span class="na">d</span><span class="p">:</span> <span class="mi">3</span> <span class="p">},</span>
  <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
  <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">c</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
  <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">d</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</code></pre></div></div>

<p>We need one <code class="language-plaintext highlighter-rouge">iassign</code> for each property that is updated. At the end of the post we will be able to slightly compress this and use the following syntax:</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">focus</span><span class="p">(</span>
  <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span> <span class="na">d</span><span class="p">:</span> <span class="mi">3</span> <span class="p">},</span>
  <span class="nx">over</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
  <span class="nx">over</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">c</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
  <span class="nx">over</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">d</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
<span class="p">);</span>
</code></pre></div></div>

<h1 id="the-how-not">The How Not</h1>

<p>Why would we need something as scary sounding as ‘existential types’? Let’s have a first attempt without anything fancy.
Our use case boils down to writing a function which takes a value of type <code class="language-plaintext highlighter-rouge">S</code> and then a collection of getters <code class="language-plaintext highlighter-rouge">S =&gt; A</code> and modifiers <code class="language-plaintext highlighter-rouge">A =&gt; A</code>.
The type <code class="language-plaintext highlighter-rouge">GetModOps&lt;S, A&gt;</code> encodes a record with such a getter and modifier function.
Then the <code class="language-plaintext highlighter-rouge">focus</code> function accumulates the results of consecutive <code class="language-plaintext highlighter-rouge">iassign</code> calls with these getters and modifiers, achieved by a <code class="language-plaintext highlighter-rouge">reduce</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">type</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="p">(</span><span class="na">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">a</span><span class="p">:</span> <span class="nx">A</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span> <span class="p">};</span>

<span class="kd">function</span> <span class="nx">focus</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">(</span>
  <span class="nx">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">,</span>
  <span class="p">...</span><span class="nx">ops</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">[]</span>
<span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">ops</span><span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">op</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">iassign</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="kd">get</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="nx">modify</span><span class="p">),</span> <span class="nx">s</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That seemed simple enough, let’s try it out.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="mi">1</span> <span class="p">}</span> <span class="p">};</span>

<span class="nx">focus</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span>
  <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">x</span><span class="p">:</span> <span class="kr">number</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">}</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Okay, let’s try a more complex example.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="dl">"</span><span class="s2">a</span><span class="dl">"</span> <span class="p">}</span> <span class="p">};</span>

<span class="nx">focus</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span>
  <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">x</span><span class="p">:</span> <span class="kr">number</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">c</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">x</span><span class="p">:</span> <span class="kr">string</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">a</span><span class="dl">"</span> <span class="p">},</span> <span class="c1">// error :(</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Whoops, A type error! We can see what is going wrong by looking at how the generic types for <code class="language-plaintext highlighter-rouge">focus</code> are instantiated.</p>

<p>First the parameter <code class="language-plaintext highlighter-rouge">x</code> instantiates type <code class="language-plaintext highlighter-rouge">S</code> to <code class="language-plaintext highlighter-rouge">{ a: { b: number, c: string } }</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">focus</span><span class="o">&lt;</span><span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">},</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span>
  <span class="p">...</span><span class="nx">ops</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">},</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">[]</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Now, the first passed <code class="language-plaintext highlighter-rouge">GetModOps</code> instantiates type <code class="language-plaintext highlighter-rouge">A</code> to <code class="language-plaintext highlighter-rouge">number</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">focus</span><span class="o">&lt;</span><span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">},</span> <span class="kr">number</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span>
  <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">x</span><span class="p">:</span> <span class="kr">number</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">},</span>
  <span class="p">...</span><span class="nx">ops</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">},</span> <span class="kr">number</span><span class="o">&gt;</span><span class="p">[]</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Then, the last <code class="language-plaintext highlighter-rouge">GetModOps</code> has type <code class="language-plaintext highlighter-rouge">string</code> where <code class="language-plaintext highlighter-rouge">A</code> was originally, but has now been instantiated to <code class="language-plaintext highlighter-rouge">number</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">focus</span><span class="o">&lt;</span><span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">},</span> <span class="o">??</span><span class="p">?</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span>
  <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">x</span><span class="p">:</span> <span class="kr">number</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">},</span>
                                      <span class="o">^</span>
 <span class="nx">A</span> <span class="nx">cannot</span> <span class="nx">be</span> <span class="nx">both</span> <span class="kr">string</span> <span class="nx">and</span> <span class="kr">number</span> <span class="o">!</span> <span class="o">|</span>
			   	      <span class="nx">v</span>
  <span class="p">{</span> <span class="nl">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">c</span><span class="p">,</span> <span class="nx">modify</span><span class="p">:</span> <span class="p">(</span><span class="nx">x</span><span class="p">:</span> <span class="kr">string</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">a</span><span class="dl">"</span> <span class="p">},</span>
<span class="p">)</span>
</code></pre></div></div>

<p>The type <code class="language-plaintext highlighter-rouge">string</code> and <code class="language-plaintext highlighter-rouge">number</code> do not unify and this results in a type error.</p>

<p>Currently, <code class="language-plaintext highlighter-rouge">focus</code> specifies that it works for any choice of <code class="language-plaintext highlighter-rouge">S</code> and <code class="language-plaintext highlighter-rouge">A</code>, but the choice of this <code class="language-plaintext highlighter-rouge">S</code> and <code class="language-plaintext highlighter-rouge">A</code> is <em>fixed</em>.
So when we try to have updates focused on a property of type <code class="language-plaintext highlighter-rouge">number</code> and <code class="language-plaintext highlighter-rouge">string</code> at the same time it does not work.</p>

<p>Instead, what we intended is that the parameter <code class="language-plaintext highlighter-rouge">A</code> is existentially quantified on the type <code class="language-plaintext highlighter-rouge">GetModOps</code>.
This means that for each <code class="language-plaintext highlighter-rouge">op</code> in <code class="language-plaintext highlighter-rouge">ops</code> there <em>exists</em> a type <code class="language-plaintext highlighter-rouge">A</code> for which we have an <code class="language-plaintext highlighter-rouge">S =&gt; A</code> and <code class="language-plaintext highlighter-rouge">A =&gt; A</code>.</p>

<h1 id="the-how">The How</h1>

<p>So, our intended <code class="language-plaintext highlighter-rouge">focus</code> function is more like this: <code class="language-plaintext highlighter-rouge">focus</code> works for all types <code class="language-plaintext highlighter-rouge">S</code> and each <code class="language-plaintext highlighter-rouge">op</code> in <code class="language-plaintext highlighter-rouge">ops</code> has a, potentially different, type <code class="language-plaintext highlighter-rouge">A</code> associated with it.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">type</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">exists</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="p">(</span><span class="na">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">a</span><span class="p">:</span> <span class="nx">A</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span> <span class="p">}</span>

<span class="kd">function</span> <span class="nx">focus</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">(</span>
  <span class="nx">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">,</span>
  <span class="p">...</span><span class="nx">ops</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">[]</span>
<span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">ops</span><span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">op</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">iassign</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="kd">get</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="nx">modify</span><span class="p">),</span> <span class="nx">s</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Where <code class="language-plaintext highlighter-rouge">&lt;exists A&gt;</code> is invented syntax to specify the existential type <code class="language-plaintext highlighter-rouge">A</code>.
Obviously, typescript does not support this syntax, so what do we do?</p>

<p>Luckily, we remember the incantation <code class="language-plaintext highlighter-rouge">&lt;exists A&gt;(T&lt;A&gt;) = &lt;R&gt;(cont: (&lt;A&gt; (t: T&lt;A&gt;) =&gt; R)) =&gt; R</code> from our <a href="http://www.cis.upenn.edu/~bcpierce/tapl/">spell book</a> (slightly adapted to fit the syntax used in typescript).</p>

<p>We create the type <code class="language-plaintext highlighter-rouge">GetMod&lt;S&gt;</code> which encodes <code class="language-plaintext highlighter-rouge">&lt;exists A&gt;(GetModOps&lt;S, A&gt;)</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">type</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="p">(</span><span class="na">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="p">(</span><span class="na">a</span><span class="p">:</span> <span class="nx">A</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span> <span class="p">};</span>
<span class="kd">type</span> <span class="nx">GetMod</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">R</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">cont</span><span class="p">:</span> <span class="o">&lt;</span><span class="nx">A</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">t</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">R</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">R</span><span class="p">;</span>
</code></pre></div></div>

<p>… Let’s take a step back here, what exactly is <code class="language-plaintext highlighter-rouge">GetMod</code> and how do we use it?</p>

<h2 id="continuations">Continuations</h2>

<p>The type <code class="language-plaintext highlighter-rouge">GetMod</code> has the form <code class="language-plaintext highlighter-rouge">(_ =&gt; R) =&gt; R</code>, which is the typical form of continuation passing style.</p>

<p>Let’s first take a look at the slightly simpler <code class="language-plaintext highlighter-rouge">type NumberCont&lt;R&gt; = (cont: (x: number) =&gt; R) =&gt; R</code>.
It is a function that takes a function <code class="language-plaintext highlighter-rouge">(x: number) =&gt; R</code> as parameter.
We can think of <code class="language-plaintext highlighter-rouge">(x: number) =&gt; R</code> as awaiting a number for completion, also known as a continuation.
So, the following function <code class="language-plaintext highlighter-rouge">yourNumber</code> is waiting for a <code class="language-plaintext highlighter-rouge">number</code> to return a <code class="language-plaintext highlighter-rouge">string</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">yourNumber</span><span class="p">(</span><span class="nx">x</span><span class="p">:</span> <span class="kr">number</span><span class="p">):</span> <span class="kr">string</span> <span class="p">{</span>
  <span class="k">return</span> <span class="p">(</span><span class="dl">"</span><span class="s2">your number is </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">x</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Then, <code class="language-plaintext highlighter-rouge">myNumber</code> of type <code class="language-plaintext highlighter-rouge">NumberCont&lt;string&gt;</code> passes the value <code class="language-plaintext highlighter-rouge">1</code> to a continuation waiting for a <code class="language-plaintext highlighter-rouge">number</code>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">myNumber</span><span class="p">:</span> <span class="nx">NumberCont</span><span class="o">&lt;</span><span class="kr">string</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nx">cont</span> <span class="o">=&gt;</span> <span class="nx">cont</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</code></pre></div></div>

<p>We obtain our result value by passing the continuation <code class="language-plaintext highlighter-rouge">yourNumber</code> to <code class="language-plaintext highlighter-rouge">myNumber</code>, or <code class="language-plaintext highlighter-rouge">myNumber(yourNumber)</code> return <code class="language-plaintext highlighter-rouge">"your number is 1"</code>.</p>

<h2 id="polymorphic-continuations">Polymorphic Continuations</h2>

<p>The use of <code class="language-plaintext highlighter-rouge">GetMod</code> is very similar to the <code class="language-plaintext highlighter-rouge">NumberCont</code> type.
To explain it, we will go back to the ‘more complicated’ example where we wanted to transform <code class="language-plaintext highlighter-rouge">{ a: { b: 1, c: "a" } }</code> with the following modifications:</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span> <span class="nl">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="nx">modify</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">}</span>
<span class="p">{</span> <span class="na">get</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">c</span><span class="p">,</span> <span class="na">modify</span><span class="p">:</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">a</span><span class="dl">"</span> <span class="p">}</span>
</code></pre></div></div>

<p>Let’s start with creating a <code class="language-plaintext highlighter-rouge">focus</code> function for this case specifically.
We create a continuation corresponding to each of the modifications we want to apply.
The first continuation waits for a <code class="language-plaintext highlighter-rouge">GetModOps</code> and applies it to <code class="language-plaintext highlighter-rouge">x</code>.
We obtain the result of the modification by passing the continuation to the modification, remember that a modification of type <code class="language-plaintext highlighter-rouge">GetMod</code> will call the passed continuation with a provided value.
The interesting part is that the type parameter <code class="language-plaintext highlighter-rouge">A</code> of each continuation is linked to the continuation, not to the <code class="language-plaintext highlighter-rouge">focus</code> function, meaning that <code class="language-plaintext highlighter-rouge">A</code> can be <em>different for each modification</em>. Which is of course exactly what we wanted!</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">focus</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">(</span>
  <span class="nx">x</span><span class="p">:</span> <span class="nx">S</span><span class="p">,</span>
  <span class="nx">modification1</span><span class="p">:</span> <span class="nx">GetMod</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">,</span>
  <span class="nx">modification2</span><span class="p">:</span> <span class="nx">GetMod</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">,</span> 
<span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">continuation1</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">A</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">op</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">iassign</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="kd">get</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="nx">modify</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">acc1</span> <span class="o">=</span> <span class="nx">modification1</span><span class="p">(</span><span class="nx">continuation1</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">continuation2</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">A</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">op</span><span class="p">:</span> <span class="nx">GetModOps</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">iassign</span><span class="p">(</span><span class="nx">acc1</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="kd">get</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="nx">modify</span><span class="p">);</span>
  <span class="k">return</span> <span class="nx">modification2</span><span class="p">(</span><span class="nx">continuation2</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>A <code class="language-plaintext highlighter-rouge">GetMod</code> is created by passing the <code class="language-plaintext highlighter-rouge">get</code> and <code class="language-plaintext highlighter-rouge">modify</code> functions as a record to the received continuation.
I called this <code class="language-plaintext highlighter-rouge">over</code> for a slightly more memorable syntax, the name is inspired by its namesake of the <a href="http://hackage.haskell.org/package/lens-4.17/docs/Control-Lens-Setter.html#v:over">Haskell lens library</a>.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">over</span><span class="o">&lt;</span><span class="nx">S</span><span class="p">,</span> <span class="nx">A</span><span class="o">&gt;</span><span class="p">(</span>
  <span class="kd">get</span><span class="p">:</span> <span class="p">(</span><span class="nx">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span><span class="p">,</span>
  <span class="nx">modify</span><span class="p">:</span> <span class="p">(</span><span class="nx">a</span><span class="p">:</span> <span class="nx">A</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">A</span><span class="p">,</span>
<span class="p">):</span> <span class="nx">GetMod</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">e</span><span class="p">({</span> <span class="kd">get</span><span class="p">,</span> <span class="nx">modify</span> <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Using <code class="language-plaintext highlighter-rouge">over</code>, we can tansform our object as advertised at the start of the post.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">transformedX</span> <span class="o">=</span> <span class="nx">focus</span><span class="p">(</span>
  <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="p">{</span> <span class="na">b</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="dl">"</span><span class="s2">a</span><span class="dl">"</span> <span class="p">}</span> <span class="p">},</span>
  <span class="nx">over</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">b</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
  <span class="nx">over</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">c</span><span class="p">,</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">a</span><span class="dl">"</span><span class="p">),</span>
<span class="p">);</span>
<span class="c1">// transformedX = { a: { b: 2, c: "aa" } }</span>
</code></pre></div></div>

<p>We can easily generalize the <code class="language-plaintext highlighter-rouge">focus</code> function with <code class="language-plaintext highlighter-rouge">reduce</code> so it takes any number of <code class="language-plaintext highlighter-rouge">GetMod</code>s.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">focus</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">(</span>
  <span class="nx">s</span><span class="p">:</span> <span class="nx">S</span><span class="p">,</span>
  <span class="p">...</span><span class="nx">mods</span><span class="p">:</span> <span class="nx">GetMod</span><span class="o">&lt;</span><span class="nx">S</span><span class="o">&gt;</span><span class="p">[]</span>
<span class="p">):</span> <span class="nx">S</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">mods</span><span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">mod</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">mod</span><span class="p">(</span><span class="nx">op</span> <span class="o">=&gt;</span> <span class="nx">iassign</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="kd">get</span><span class="p">,</span> <span class="nx">op</span><span class="p">.</span><span class="nx">modify</span><span class="p">)),</span> <span class="nx">s</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

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

<p>In this post we covered the use of existential types encoding to create a wrapper for the <a href="https://github.com/engineforce/ImmutableAssign"><code class="language-plaintext highlighter-rouge">immutable-assign</code></a> library.
We took a closer look at the use of this encoding with an analogy to continuation passing style.</p>]]></content><author><name>rubenpieters</name></author><category term="Programming" /><category term="TypeScript" /><summary type="html"><![CDATA[In this post we will take a look at a use case where the encoding for existential types helped me create a small utility wrapper for the immutable-assign library.]]></summary></entry><entry><title type="html">SubRecords in Purescript</title><link href="rubenpieters.github.io/programming/purescript/2018/03/02/subrecord-purescript.html" rel="alternate" type="text/html" title="SubRecords in Purescript" /><published>2018-03-02T00:00:00+00:00</published><updated>2018-03-02T00:00:00+00:00</updated><id>rubenpieters.github.io/programming/purescript/2018/03/02/subrecord-purescript</id><content type="html" xml:base="rubenpieters.github.io/programming/purescript/2018/03/02/subrecord-purescript.html"><![CDATA[<p>Purescript has the <code class="language-plaintext highlighter-rouge">Record</code> type to nicely handle records.
A <code class="language-plaintext highlighter-rouge">Record x</code> <em>must</em> contain values at all labels in the row <code class="language-plaintext highlighter-rouge">x</code>.
For example, a value of type <code class="language-plaintext highlighter-rouge">Record ( x :: Int, y :: String )</code> must contain an <code class="language-plaintext highlighter-rouge">Int</code> value at label <code class="language-plaintext highlighter-rouge">x</code> and a <code class="language-plaintext highlighter-rouge">String</code> value at label <code class="language-plaintext highlighter-rouge">y</code>.</p>

<p>However, it lacks nice support for subrecords, a record which <em>may</em> contain values for the labels.
While we can create the <code class="language-plaintext highlighter-rouge">SubRow</code> class to denote in the context that we are dealing with a subrecord, it does not solve all our problems.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cd">-- | `Union a b c` means a ∪ b = c</span>
<span class="cd">-- | `SubRow a b` means a is a subrow of b</span>
<span class="cd">-- | or: there exists an x for which `Union a x b` holds</span>
<span class="kr">class</span> <span class="kt">SubRow</span> <span class="p">(</span><span class="n">a</span> <span class="o">::</span> <span class="o">#</span> <span class="kt">Type</span><span class="p">)</span> <span class="p">(</span><span class="n">b</span> <span class="o">::</span> <span class="o">#</span> <span class="kt">Type</span><span class="p">)</span>
<span class="kr">instance</span> <span class="n">subRow</span> <span class="o">::</span> <span class="kt">Union</span> <span class="n">a</span> <span class="n">x</span> <span class="n">b</span> <span class="o">=&gt;</span> <span class="kt">SubRow</span> <span class="n">a</span> <span class="n">b</span>
</code></pre></div></div>

<p>Let’s say we wanted to create a subrecord as a value. The following will not compile:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- does not compile</span>
<span class="n">testSubRecord1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">SubRow</span> <span class="n">a</span> <span class="p">(</span> <span class="n">x</span> <span class="o">::</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">y</span> <span class="o">::</span> <span class="kt">String</span> <span class="p">)</span> <span class="o">=&gt;</span> <span class="kt">Record</span> <span class="n">a</span>
<span class="n">testSubRecord1</span> <span class="o">=</span> <span class="p">{</span> <span class="n">x</span><span class="o">:</span> <span class="mi">42</span> <span class="p">}</span>
</code></pre></div></div>

<p>The problem is that we need an <code class="language-plaintext highlighter-rouge">exists</code> quantifier, instead of a <code class="language-plaintext highlighter-rouge">forall</code> quantifier.
Namely, there exists an <code class="language-plaintext highlighter-rouge">a</code>, in this case <code class="language-plaintext highlighter-rouge">( x :: Int )</code>, which is a subrow of <code class="language-plaintext highlighter-rouge">( x :: Int, y :: String )</code> and returned as value.
Function <code class="language-plaintext highlighter-rouge">testSubRecord1</code> does not work for all subrows of <code class="language-plaintext highlighter-rouge">( x :: Int, y :: String )</code>.</p>

<h1 id="purescript-subrecord">purescript-subrecord</h1>

<p>Introducing the Work-In-Progress <a href="https://github.com/rubenpieters/purescript-subrecord">purescript-subrecord</a>, a library which contains the <code class="language-plaintext highlighter-rouge">SubRecord</code> type.
A <code class="language-plaintext highlighter-rouge">SubRecord x</code> <em>may</em> contain values for the labels in row <code class="language-plaintext highlighter-rouge">x</code>.
For example, a value of type <code class="language-plaintext highlighter-rouge">SubRecord ( x :: Int, y :: String )</code> could be any of: <code class="language-plaintext highlighter-rouge">{}</code>, <code class="language-plaintext highlighter-rouge">{ x :: Int }</code>, <code class="language-plaintext highlighter-rouge">{ y :: String}</code> or <code class="language-plaintext highlighter-rouge">{ x :: String, y :: String }</code>.</p>

<p>So, how does it work? Let’s take a look at the data declaration for <code class="language-plaintext highlighter-rouge">SubRecord</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">foreign</span> <span class="kr">import</span> <span class="nn">data</span> <span class="kt">SubRecord</span> <span class="o">::</span> <span class="o">#</span> <span class="kt">Type</span> <span class="o">-&gt;</span> <span class="kt">Type</span>
</code></pre></div></div>

<p>It has the same kind as <code class="language-plaintext highlighter-rouge">Record</code>, but the data type does not have any constructor for its values. Instead a constructor function is provided,
giving us something similar to an <code class="language-plaintext highlighter-rouge">exists</code> quantifier. I got this idea from the <a href="https://github.com/purescript/purescript-exists">purescript-exists</a> library.
To create a <code class="language-plaintext highlighter-rouge">SubRecord</code> we use <code class="language-plaintext highlighter-rouge">mkSubRecord</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mkSubRecord</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span> <span class="n">x</span> <span class="n">r</span><span class="o">.</span>
               <span class="kt">Union</span> <span class="n">a</span> <span class="n">x</span> <span class="n">r</span> <span class="o">=&gt;</span>
               <span class="kt">Record</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">SubRecord</span> <span class="n">r</span>
<span class="n">mkSubRecord</span> <span class="o">=</span> <span class="n">unsafeCoerce</span>
</code></pre></div></div>

<p>It uses <code class="language-plaintext highlighter-rouge">unsafeCoerce</code> under the hood, a <code class="language-plaintext highlighter-rouge">SubRecord</code> uses the same underlying representation as a <code class="language-plaintext highlighter-rouge">Record</code>.</p>

<p>We can use <code class="language-plaintext highlighter-rouge">mkSubRecord</code> on a <code class="language-plaintext highlighter-rouge">Record a</code>, from which it creates a <code class="language-plaintext highlighter-rouge">SubRecord r</code> if <code class="language-plaintext highlighter-rouge">a</code> is a subrow of <code class="language-plaintext highlighter-rouge">r</code>.
This constructor allows the returning of subrecords as values, for example:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">testSubRecord2</span> <span class="o">::</span> <span class="kt">SubRecord</span> <span class="p">(</span> <span class="n">x</span> <span class="o">::</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">y</span> <span class="o">::</span> <span class="kt">String</span> <span class="p">)</span>
<span class="n">testSubRecord2</span> <span class="o">=</span> <span class="n">mkSubRecord</span> <span class="p">{</span> <span class="n">x</span><span class="o">:</span> <span class="mi">42</span> <span class="p">}</span>
</code></pre></div></div>

<p>And if we try to add a wrong label, the compiler will warn us.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">wrongLabel</span> <span class="o">::</span> <span class="kt">SubRecord</span> <span class="p">(</span> <span class="n">x</span> <span class="o">::</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">y</span> <span class="o">::</span> <span class="kt">String</span> <span class="p">)</span>
<span class="n">wrongLabel</span> <span class="o">=</span> <span class="n">mkSubRecord</span> <span class="p">{</span> <span class="n">z</span><span class="o">:</span> <span class="mi">42</span> <span class="p">}</span>
             <span class="o">^^^^^^^^^^^^^^^^^^^^^</span>
   <span class="n">could</span> <span class="n">not</span> <span class="n">match</span> <span class="p">(</span> <span class="n">z</span> <span class="o">::</span> <span class="kt">Int</span> <span class="o">|</span> <span class="n">r</span> <span class="p">)</span> <span class="n">with</span> <span class="p">(</span> <span class="n">x</span> <span class="o">::</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">y</span> <span class="o">::</span> <span class="kt">String</span> <span class="p">)</span>
</code></pre></div></div>

<p>We can go back to a <code class="language-plaintext highlighter-rouge">Record</code> by providing default values for all labels in the row.
(Note: For some reason the function <code class="language-plaintext highlighter-rouge">withDefaults</code> compiles only if the type is inferred, it doesn’t compile if the annotation is given explicitly.)</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">withDefaults</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">Record</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">SubRecord</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">Record</span> <span class="n">a</span>
<span class="n">withDefaults</span> <span class="n">defaults</span> <span class="o">=</span> <span class="n">unSubRecord</span> <span class="p">(</span><span class="nf">\</span><span class="n">r</span> <span class="o">-&gt;</span> <span class="kt">Record</span><span class="o">.</span><span class="n">build</span> <span class="p">(</span><span class="kt">Record</span><span class="o">.</span><span class="n">merge</span> <span class="n">defaults</span><span class="p">)</span> <span class="n">r</span><span class="p">)</span>
</code></pre></div></div>

<p>Which makes use of the slightly more general <code class="language-plaintext highlighter-rouge">unSubRecord</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unSubRecord</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">x</span> <span class="n">r</span><span class="o">.</span>
               <span class="p">(</span><span class="n">forall</span> <span class="n">a</span><span class="o">.</span>
                <span class="kt">Union</span> <span class="n">a</span> <span class="n">x</span> <span class="n">r</span> <span class="o">=&gt;</span>
                <span class="kt">Record</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">Record</span> <span class="n">r</span>
               <span class="p">)</span> <span class="o">-&gt;</span>
               <span class="kt">SubRecord</span> <span class="n">r</span> <span class="o">-&gt;</span> <span class="kt">Record</span> <span class="n">r</span>
<span class="n">unSubRecord</span> <span class="o">=</span> <span class="n">passNullContext</span>
</code></pre></div></div>

<p>Which is basically <code class="language-plaintext highlighter-rouge">unsafeCoerce</code> but it passes an <code class="language-plaintext highlighter-rouge">undefined</code> into the dictionary argument of the <code class="language-plaintext highlighter-rouge">forall a. Union a x r =&gt; Record a -&gt; Record r</code> function.
The <code class="language-plaintext highlighter-rouge">unSubRecord</code> is the deconstructor for <code class="language-plaintext highlighter-rouge">SubRecord</code>, it safely transforms a <code class="language-plaintext highlighter-rouge">SubRecord</code> into a <code class="language-plaintext highlighter-rouge">Record</code> by taking a function which works on <em>all</em> subrecords <code class="language-plaintext highlighter-rouge">a</code> of <code class="language-plaintext highlighter-rouge">r</code>.</p>

<p>An example use of <code class="language-plaintext highlighter-rouge">withDefaults</code> is:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">testWithDef</span> <span class="o">::</span> <span class="p">{</span> <span class="n">x</span> <span class="o">::</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">y</span> <span class="o">::</span> <span class="kt">String</span> <span class="p">}</span>
<span class="n">testWithDef</span> <span class="o">=</span> <span class="n">withDefaults</span> <span class="p">{</span> <span class="n">x</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">:</span> <span class="s">"default"</span> <span class="p">}</span> <span class="n">testSubRecord2</span>
</code></pre></div></div>

<p>Then <code class="language-plaintext highlighter-rouge">testWithDef.x</code> evaluates to <code class="language-plaintext highlighter-rouge">42</code>, set by <code class="language-plaintext highlighter-rouge">testSubRecord2</code>, and <code class="language-plaintext highlighter-rouge">testWithDef.y</code> evaluates to <code class="language-plaintext highlighter-rouge">"default"</code>, the given default for label <code class="language-plaintext highlighter-rouge">y</code>.</p>

<h1 id="building-subrecords">Building SubRecords</h1>

<p>With the <code class="language-plaintext highlighter-rouge">Data.SubRecord.Builder</code>, similar to the <code class="language-plaintext highlighter-rouge">Data.Record.Builder</code>, we can create a record by <code class="language-plaintext highlighter-rouge">insert</code>ing values one at a time.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">insert</span>
  <span class="o">::</span> <span class="n">forall</span> <span class="n">l</span> <span class="n">a</span> <span class="n">r1</span> <span class="n">r2</span>
   <span class="o">.</span> <span class="kt">RowCons</span> <span class="n">l</span> <span class="n">a</span> <span class="n">r1</span> <span class="n">r2</span>
  <span class="o">=&gt;</span> <span class="kt">RowLacks</span> <span class="n">l</span> <span class="n">r1</span>
  <span class="o">=&gt;</span> <span class="kt">IsSymbol</span> <span class="n">l</span>
  <span class="o">=&gt;</span> <span class="kt">SProxy</span> <span class="n">l</span>
  <span class="o">-&gt;</span> <span class="kt">Maybe</span> <span class="n">a</span>
  <span class="o">-&gt;</span> <span class="kt">Builder</span> <span class="p">(</span><span class="kt">SubRecord</span> <span class="n">r1</span><span class="p">)</span> <span class="p">(</span><span class="kt">SubRecord</span> <span class="n">r2</span><span class="p">)</span>
<span class="n">insert</span> <span class="n">l</span> <span class="p">(</span><span class="kt">Just</span> <span class="n">a</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Builder</span> <span class="nf">\</span><span class="n">r1</span> <span class="o">-&gt;</span> <span class="n">unsafeInsert</span> <span class="p">(</span><span class="n">reflectSymbol</span> <span class="n">l</span><span class="p">)</span> <span class="n">a</span> <span class="n">r1</span>
<span class="n">insert</span> <span class="n">l</span> <span class="kt">Nothing</span> <span class="o">=</span> <span class="kt">Builder</span> <span class="nf">\</span><span class="n">r1</span> <span class="o">-&gt;</span> <span class="n">unsafeCoerce</span> <span class="n">r1</span>
</code></pre></div></div>

<p>Notice that we can add <code class="language-plaintext highlighter-rouge">Maybe a</code> values to the <code class="language-plaintext highlighter-rouge">SubRecord</code>, meaning that we can extend the label of the <code class="language-plaintext highlighter-rouge">SubRecord</code> without actually adding a value.
For example:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">testInsert</span> <span class="o">::</span> <span class="kt">SubRecord</span> <span class="p">(</span> <span class="n">x</span> <span class="o">::</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">y</span> <span class="o">::</span> <span class="kt">String</span> <span class="p">)</span>
<span class="n">testInsert</span> <span class="o">=</span>
  <span class="kt">SubRecord</span><span class="o">.</span><span class="n">build</span>
    <span class="p">(</span><span class="kt">SubRecord</span><span class="o">.</span><span class="n">insert</span> <span class="p">(</span><span class="kt">SProxy</span> <span class="o">::</span> <span class="kt">SProxy</span> <span class="s">"x"</span><span class="p">)</span> <span class="p">(</span><span class="kt">Just</span> <span class="mi">42</span><span class="p">)</span> <span class="o">&gt;&gt;&gt;</span>
     <span class="kt">SubRecord</span><span class="o">.</span><span class="n">insert</span> <span class="p">(</span><span class="kt">SProxy</span> <span class="o">::</span> <span class="kt">SProxy</span> <span class="s">"y"</span><span class="p">)</span> <span class="kt">Nothing</span>
    <span class="p">)</span> <span class="p">(</span><span class="n">mkSubRecord</span> <span class="p">{})</span>
</code></pre></div></div>

<p>Is equivalent to <code class="language-plaintext highlighter-rouge">mkSubRecord { x: 42 } :: SubRecord ( x :: Int, y :: String )</code>.</p>

<h1 id="feedback-welcome">Feedback Welcome</h1>

<p>Any feedback or suggestions are welcome, so they can be added before I make the first release.
I plan to port the <code class="language-plaintext highlighter-rouge">Data.Record.Builder</code> functions present in purescript-record to their <code class="language-plaintext highlighter-rouge">SubRecord</code> equivalent.
Feel free to add suggestions as a <a href="https://github.com/rubenpieters/purescript-subrecord/issues">github issue</a>.</p>]]></content><author><name>rubenpieters</name></author><category term="Programming" /><category term="Purescript" /><summary type="html"><![CDATA[Purescript has the Record type to nicely handle records. A Record x must contain values at all labels in the row x. For example, a value of type Record ( x :: Int, y :: String ) must contain an Int value at label x and a String value at label y.]]></summary></entry><entry><title type="html">Choosing between nub and ordNub? In Scala you don’t have to!</title><link href="rubenpieters.github.io/programming/scala/2018/02/09/nub-ordnub-1.html" rel="alternate" type="text/html" title="Choosing between nub and ordNub? In Scala you don’t have to!" /><published>2018-02-09T00:00:00+00:00</published><updated>2018-02-09T00:00:00+00:00</updated><id>rubenpieters.github.io/programming/scala/2018/02/09/nub-ordnub-1</id><content type="html" xml:base="rubenpieters.github.io/programming/scala/2018/02/09/nub-ordnub-1.html"><![CDATA[<p>Haskell’s <code class="language-plaintext highlighter-rouge">Data.List</code> module contains <a href="http://hackage.haskell.org/package/base-4.10.1.0/docs/Data-List.html#v:nub"><code class="language-plaintext highlighter-rouge">nub</code></a>, a function which removes duplicate elements from a list.
However, it doesn’t have very good performance.
The culprit is the <code class="language-plaintext highlighter-rouge">Eq</code> constraint, limiting the function to comparing elements for equality.
There is an improved version called <a href="https://github.com/nh2/haskell-ordnub"><code class="language-plaintext highlighter-rouge">ordNub</code></a>, but it requires an <code class="language-plaintext highlighter-rouge">Ord</code> constraint.</p>

<p>The interesting point I want to highlight in this post doesn’t have much to do with this specific use case. It’s probably quite rare that you specifically need <code class="language-plaintext highlighter-rouge">nub</code> where <code class="language-plaintext highlighter-rouge">ordNub</code> wouldn’t work.
What I do want to highlight is that if this situation ever arose in Scala, we would be able to use <a href="https://stackoverflow.com/a/1887678">implicit prioritization</a> to avoid having to choose at all.</p>

<h1 id="approach">Approach</h1>

<p>We are going to create a typeclass containing the function signature for <code class="language-plaintext highlighter-rouge">nub</code>.
By using implicit prioritization we can prefer the instance which uses <code class="language-plaintext highlighter-rouge">Ord</code> over the one with <code class="language-plaintext highlighter-rouge">Eq</code>, this is done by putting the <code class="language-plaintext highlighter-rouge">Ord</code>-based instance in a subclass.
This was explained in the stackoverflow post:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">trait</span> <span class="nc">LowPriorityImplicits</span> <span class="o">{</span>
  <span class="c1">//lower priority conversions</span>
<span class="o">}</span>

<span class="k">object</span> <span class="nc">HighPriorityImplicits</span> <span class="k">extends</span> <span class="nc">LowPriorityImplicits</span> <span class="o">{</span>
  <span class="c1">//higher-order ones here</span>
<span class="o">}</span>
</code></pre></div></div>

<h1 id="implementation">Implementation</h1>

<p>First we set up the <code class="language-plaintext highlighter-rouge">Eq</code> and <code class="language-plaintext highlighter-rouge">Ord</code> typeclasses so we can control the available implicit values for them.
We’re not actually going to implement any deduplicator functions here, so let’s just make them return a cool <code class="language-plaintext highlighter-rouge">String</code>.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">trait</span> <span class="nc">Eq</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">eq</span><span class="k">:</span> <span class="kt">String</span>
<span class="o">}</span>
<span class="k">trait</span> <span class="nc">Ord</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">val</span> <span class="nv">ord</span><span class="k">:</span> <span class="kt">String</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Let’s give <code class="language-plaintext highlighter-rouge">Int</code> an <code class="language-plaintext highlighter-rouge">Eq</code> and <code class="language-plaintext highlighter-rouge">Ord</code> instance, but only give <code class="language-plaintext highlighter-rouge">String</code> an <code class="language-plaintext highlighter-rouge">Eq</code> instance.
So, when we <code class="language-plaintext highlighter-rouge">nub</code> a list of <code class="language-plaintext highlighter-rouge">Int</code>s it should use the <code class="language-plaintext highlighter-rouge">Ord</code> version while for a list of <code class="language-plaintext highlighter-rouge">String</code>s it should use the <code class="language-plaintext highlighter-rouge">Eq</code> version.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">implicit</span> <span class="k">val</span> <span class="nv">eqInt</span><span class="k">:</span> <span class="kt">Eq</span><span class="o">[</span><span class="kt">Int</span><span class="o">]</span>
 <span class="k">=</span> <span class="k">new</span> <span class="nc">Eq</span><span class="o">[</span><span class="kt">Int</span><span class="o">]</span> <span class="o">{</span> <span class="k">val</span> <span class="nv">eq</span> <span class="k">=</span> <span class="s">"My name is Eq Int."</span> <span class="o">}</span>
<span class="k">implicit</span> <span class="k">val</span> <span class="nv">ordInt</span><span class="k">:</span> <span class="kt">Ord</span><span class="o">[</span><span class="kt">Int</span><span class="o">]</span>
 <span class="k">=</span> <span class="k">new</span> <span class="nc">Ord</span><span class="o">[</span><span class="kt">Int</span><span class="o">]</span> <span class="o">{</span> <span class="k">val</span> <span class="nv">ord</span> <span class="k">=</span> <span class="s">"Hi! I'm Ord Int."</span> <span class="o">}</span>

<span class="k">implicit</span> <span class="k">val</span> <span class="nv">eqString</span><span class="k">:</span> <span class="kt">Eq</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span>
 <span class="k">=</span> <span class="k">new</span> <span class="nc">Eq</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="o">{</span> <span class="k">val</span> <span class="nv">eq</span> <span class="k">=</span> <span class="s">"Hello there, I am known as Eq String."</span> <span class="o">}</span>
</code></pre></div></div>

<p>We set up another typeclass called <code class="language-plaintext highlighter-rouge">Nubbable</code>.
We prioritize the creation of instances for this typeclass with a simple rule: prefer the <code class="language-plaintext highlighter-rouge">Ord</code>-based over the <code class="language-plaintext highlighter-rouge">Eq</code>-based one.
We can do this by putting the <code class="language-plaintext highlighter-rouge">Ord</code>-based instance in a subclass of where the <code class="language-plaintext highlighter-rouge">Eq</code>-based instance is located.
For example:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">trait</span> <span class="nc">Nubbable</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">nubbed</span><span class="o">(</span><span class="n">l</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span><span class="k">:</span> <span class="kt">String</span>
<span class="o">}</span>

<span class="k">trait</span> <span class="nc">LowPrio</span> <span class="o">{</span>
  <span class="k">implicit</span> <span class="k">def</span> <span class="nf">eqNub</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="k">implicit</span> <span class="n">ev</span><span class="k">:</span> <span class="kt">Eq</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span><span class="k">:</span> <span class="kt">Nubbable</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span>
    <span class="k">=</span> <span class="k">new</span> <span class="nc">Nubbable</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="o">{</span>
      <span class="k">def</span> <span class="nf">nubbed</span><span class="o">(</span><span class="n">l</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span> <span class="k">=</span> <span class="s">"Message from nubber: "</span> <span class="o">+</span> <span class="nv">ev</span><span class="o">.</span><span class="py">eq</span>
    <span class="o">}</span>
<span class="o">}</span>

<span class="k">object</span> <span class="nc">HighPrio</span> <span class="k">extends</span> <span class="nc">LowPrio</span> <span class="o">{</span>
  <span class="k">implicit</span> <span class="k">def</span> <span class="nf">ordNub</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="k">implicit</span> <span class="n">ev</span><span class="k">:</span> <span class="kt">Ord</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span><span class="k">:</span> <span class="kt">Nubbable</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span>
    <span class="k">=</span> <span class="k">new</span> <span class="nc">Nubbable</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="o">{</span>
      <span class="k">def</span> <span class="nf">nubbed</span><span class="o">(</span><span class="n">l</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span> <span class="k">=</span> <span class="s">"Message from nubber: "</span> <span class="o">+</span> <span class="nv">ev</span><span class="o">.</span><span class="py">ord</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Now, when we create our <code class="language-plaintext highlighter-rouge">nub</code> function by taking <code class="language-plaintext highlighter-rouge">Nubbable</code> as an implicit parameter and run it on some examples we get our expected output.
The <code class="language-plaintext highlighter-rouge">Ord</code> instance responds for <code class="language-plaintext highlighter-rouge">Int</code>, while the <code class="language-plaintext highlighter-rouge">Eq</code> instance responds for <code class="language-plaintext highlighter-rouge">String</code>.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nn">HighPrio._</span>

<span class="k">def</span> <span class="nf">nub</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">l</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="k">implicit</span> <span class="n">ev</span><span class="k">:</span> <span class="kt">Nubbable</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span><span class="k">:</span> <span class="kt">String</span>
 <span class="k">=</span> <span class="nv">ev</span><span class="o">.</span><span class="py">nubbed</span><span class="o">(</span><span class="n">l</span><span class="o">)</span>

<span class="nf">println</span><span class="o">(</span><span class="nf">nub</span><span class="o">(</span><span class="nc">List</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span><span class="mi">2</span><span class="o">,</span><span class="mi">3</span><span class="o">)))</span>
<span class="c1">// Message from nubber: Hi! I'm Ord Int.</span>
<span class="nf">println</span><span class="o">(</span><span class="nf">nub</span><span class="o">(</span><span class="nc">List</span><span class="o">(</span><span class="s">"a"</span><span class="o">,</span><span class="s">"b"</span><span class="o">,</span><span class="s">"c"</span><span class="o">)))</span>
<span class="c1">// Message from nubber: Hello there, I am known as Eq String.</span>
</code></pre></div></div>

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

<p>I think this is a cool showcase of maybe a lesser known feature, used by <a href="https://github.com/milessabin/kittens/blob/53259ebca7f98d142a30eda48a3ae0a01668de54/core/src/main/scala/cats/derived/consk.scala#L39">some</a> <a href="https://github.com/circe/circe/blob/1efc2877f113c0b5ea9d9525c293c5d3db7e8389/modules/generic/shared/src/main/scala/io/circe/generic/decoding/DerivedDecoder.scala">Scala</a> <a href="https://github.com/milessabin/shapeless/blob/8511884030ac061c6ab01940b188fcab53aff151/core/src/main/scala/shapeless/poly.scala#L146">libraries</a>.
I also find it interesting that I could easily solve this problem in Scala, while I wouldn’t know how to solve it in a same fashion in Haskell (if it is even possible).
You can find the code for this example <a href="https://scalafiddle.io/sf/ygAxm5B/0">here</a>.</p>]]></content><author><name>rubenpieters</name></author><category term="Programming" /><category term="Scala" /><summary type="html"><![CDATA[Haskell’s Data.List module contains nub, a function which removes duplicate elements from a list. However, it doesn’t have very good performance. The culprit is the Eq constraint, limiting the function to comparing elements for equality. There is an improved version called ordNub, but it requires an Ord constraint.]]></summary></entry><entry><title type="html">Unsafely Inspecting Monadic Computations</title><link href="rubenpieters.github.io/programming/purescript/2018/01/10/unsafely-inspecting-monadic-computations.html" rel="alternate" type="text/html" title="Unsafely Inspecting Monadic Computations" /><published>2018-01-10T00:00:00+00:00</published><updated>2018-01-10T00:00:00+00:00</updated><id>rubenpieters.github.io/programming/purescript/2018/01/10/unsafely-inspecting-monadic-computations</id><content type="html" xml:base="rubenpieters.github.io/programming/purescript/2018/01/10/unsafely-inspecting-monadic-computations.html"><![CDATA[<p>After some discussion on reddit following <a href="http://lukajcb.github.io/blog/functional/2018/01/03/optimizing-tagless-final.html">Luka’s post on optimizing 
tagless final computations</a>, I realized a trick for inspecting monadic 
programs, but in an unsafe manner. Luka’s technique of optimizing computations is 
rooted in the idea of the <code class="language-plaintext highlighter-rouge">analyzeFreeAp</code> function of the <a href="https://github.com/ethul/purescript-freeap/blob/master/src/Control/Applicative/Free.purs">Free Applicative</a> (or 
<code class="language-plaintext highlighter-rouge">runAp_</code> in Haskell’s <a href="https://github.com/typelevel/cats/blob/master/free/src/main/scala/cats/free/FreeApplicative.scala">free package</a>). This idea is applied in the context 
of tagless final programs, but the fact still remains that it is a safe 
way of inspecting programs. Safe meaning that whatever handler we write, 
it can be applied to applicative programs without any runtime error. 
Unsafe in this context means that we will be cheating the type system 
and as a result runtime errors might surface when the wrong handler is 
combined with the wrong program.</p>

<p><em>For this reason I would disadvise using this trick in actual code</em>, 
make sure you are aware of the risks and are able to deal with them if you ever intend to use this.</p>

<p>The examples are given in Purescript. The effect of laziness (for example in Haskell) on this trick is discussed in section ‘Laziness’.</p>

<h1 id="monadic-computations">Monadic Computations</h1>

<p>As opposed to computations with <code class="language-plaintext highlighter-rouge">Applicative</code> constraints, this post 
will only handle computations which have <code class="language-plaintext highlighter-rouge">Monad</code> constraints.
For example consider the following computation:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">prog1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">f</span> <span class="n">r</span> <span class="n">a</span><span class="o">.</span>
         <span class="kt">Monad</span> <span class="n">f</span> <span class="o">=&gt;</span>
         <span class="p">{</span> <span class="n">get</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span>
         <span class="p">,</span> <span class="n">put</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="kt">Unit</span> <span class="o">|</span> <span class="n">r</span> <span class="p">}</span> <span class="o">-&gt;</span>
         <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Array</span> <span class="n">a</span><span class="p">)</span>
<span class="n">prog1</span> <span class="n">k</span> <span class="n">mouse</span> <span class="o">=</span> <span class="kr">do</span>
   <span class="n">f</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">s</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Dogs"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">put</span> <span class="s">"Mice"</span> <span class="n">mouse</span>
   <span class="n">t</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">pure</span> <span class="p">[</span><span class="n">f</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">]</span>
</code></pre></div></div>

<p>The type signature tells us that we need a handler <code class="language-plaintext highlighter-rouge">k</code> which interprets at 
least the <code class="language-plaintext highlighter-rouge">get</code> and <code class="language-plaintext highlighter-rouge">put</code> operations, it also takes an input for the <code class="language-plaintext highlighter-rouge">"Mice"</code> 
location named <code class="language-plaintext highlighter-rouge">mouse</code>. The computation returns all retrieved data as an <code class="language-plaintext highlighter-rouge">f (Array a)</code>, 
<code class="language-plaintext highlighter-rouge">f</code> being the type constructor the handler interprets to.</p>

<p>We want to interpret the computation into two <code class="language-plaintext highlighter-rouge">Set</code>s, one to gather all keys
from <code class="language-plaintext highlighter-rouge">get</code> operations and the other to gather all keys and values from <code class="language-plaintext highlighter-rouge">put</code> operations.
These <code class="language-plaintext highlighter-rouge">Set</code>s enable the creation of an optimized program: a unique
get and put for each location, but we won’t go into detail on this here.</p>

<p>However, we cannot use applicative inspection using <code class="language-plaintext highlighter-rouge">Const</code> to realize this. The program 
is written in <code class="language-plaintext highlighter-rouge">do</code> notation and thus has a <code class="language-plaintext highlighter-rouge">Monad</code> constraint and 
<code class="language-plaintext highlighter-rouge">Const</code> doesn’t have a <code class="language-plaintext highlighter-rouge">Monad</code> instance. This is where the trick comes 
in. We will write an interpretation to <code class="language-plaintext highlighter-rouge">Writer</code>. Normally we would 
consider this impossible because of the following problem:</p>

<p>We need to write an interpretation for the <code class="language-plaintext highlighter-rouge">get</code> and <code class="language-plaintext highlighter-rouge">put</code> operation. 
However, note the spots marked with <code class="language-plaintext highlighter-rouge">?</code>. We need to construct the writer 
by giving it both a value <code class="language-plaintext highlighter-rouge">a</code> and a value of <code class="language-plaintext highlighter-rouge">(Set, Set)</code>. Remember 
that <code class="language-plaintext highlighter-rouge">Writer w a</code> is isomorphic to <code class="language-plaintext highlighter-rouge">(w, a)</code>. The value <code class="language-plaintext highlighter-rouge">a</code> is missing 
since we are not actually running the computation, merely inspecting it.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">get1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="kt">String</span> <span class="kt">Int</span><span class="p">)))</span> <span class="n">a</span>
<span class="n">get1</span> <span class="n">key</span> <span class="o">=</span> <span class="n">writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="o">?</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">singleton</span> <span class="n">key</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">empty</span><span class="p">)))</span>

<span class="n">put1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="kt">String</span> <span class="kt">Int</span><span class="p">)))</span> <span class="n">a</span>
<span class="n">put1</span> <span class="n">key</span> <span class="n">value</span> <span class="o">=</span> <span class="n">writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="o">?</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">empty</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">singleton</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="n">key</span> <span class="n">value</span><span class="p">))))</span>
</code></pre></div></div>

<p>The trick is actually very simple, we will use a function which tricks the type system:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undef</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="n">a</span>
<span class="n">undef</span> <span class="o">=</span> <span class="n">unsafeCoerce</span> <span class="s">"oops!"</span>
</code></pre></div></div>

<p>We use this new <code class="language-plaintext highlighter-rouge">undef</code> as a replacement for <code class="language-plaintext highlighter-rouge">?</code>, 
essentially cheating the type system by saying the value <code class="language-plaintext highlighter-rouge">a</code> is available while it actually isn’t.
However, we never intend to do anything with this value, so this fact doesn’t matter.
We replace ? by <code class="language-plaintext highlighter-rouge">undef</code> to obtain the handler:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">get1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="kt">String</span> <span class="kt">Int</span><span class="p">)))</span> <span class="n">a</span>
<span class="n">get1</span> <span class="n">key</span> <span class="o">=</span> <span class="n">writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="n">undef</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">singleton</span> <span class="n">key</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">empty</span><span class="p">)))</span>

<span class="n">put1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="kt">String</span> <span class="kt">Int</span><span class="p">)))</span> <span class="n">a</span>
<span class="n">put1</span> <span class="n">key</span> <span class="n">value</span> <span class="o">=</span> <span class="n">writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="n">undef</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">empty</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">singleton</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="n">key</span> <span class="n">value</span><span class="p">))))</span>
</code></pre></div></div>

<p>This is already sufficient to inspect <code class="language-plaintext highlighter-rouge">prog1</code> and give us the result 
we want, for the gets [“Cats”, “Dogs”] and for the puts [(“Mice”, 1)]:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="o">&gt;</span> <span class="n">snd</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog1</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get1</span><span class="p">,</span> <span class="n">put</span><span class="o">:</span><span class="n">put1</span><span class="p">}</span> <span class="mi">1</span>
<span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">(</span><span class="s">"Cats"</span> <span class="o">:</span> <span class="s">"Dogs"</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">))</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">((</span><span class="kt">Tuple</span> <span class="s">"Mice"</span> <span class="mi">1</span><span class="p">)</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">)))</span>
</code></pre></div></div>

<p>We can also see the type system lying to us (because we cheated!):</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="o">&gt;</span> <span class="o">:</span><span class="n">t</span> <span class="n">fst</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog1</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get1</span><span class="p">,</span> <span class="n">put</span><span class="o">:</span><span class="n">put1</span><span class="p">}</span> <span class="mi">1</span>
<span class="kt">Array</span> <span class="kt">Int</span>
</code></pre></div></div>

<p>Which, when evaluated, gives us <code class="language-plaintext highlighter-rouge">["oops!","oops!","oops!"]</code>, definitely not an array of <code class="language-plaintext highlighter-rouge">Int</code>s!
But, again, the intention of the inspection is to ignore the actual result of the computation, the <code class="language-plaintext highlighter-rouge">a</code> part of the writer is intended to never be used.
So, while somewhat weird, this isn’t really the problem with the trick.</p>

<h1 id="laziness">Laziness</h1>

<p>Laziness has some interesting implication for this trick.
Consider a slightly altered version of our scenario. The <code class="language-plaintext highlighter-rouge">get</code> operation 
returns <code class="language-plaintext highlighter-rouge">Maybe a</code> instead of <code class="language-plaintext highlighter-rouge">a</code>:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">prog2_strict</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">f</span> <span class="n">r</span> <span class="n">a</span><span class="o">.</span>
                <span class="kt">Monad</span> <span class="n">f</span> <span class="o">=&gt;</span>
                <span class="p">{</span> <span class="n">get</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Maybe</span> <span class="n">a</span><span class="p">)</span>
                <span class="p">,</span> <span class="n">put</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="kt">Unit</span> <span class="o">|</span> <span class="n">r</span> <span class="p">}</span> <span class="o">-&gt;</span>
                <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Array</span> <span class="n">a</span><span class="p">)</span>
<span class="n">prog2_strict</span> <span class="n">k</span> <span class="n">mouse</span> <span class="o">=</span> <span class="kr">do</span>
   <span class="n">f</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">s</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Dogs"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">put</span> <span class="s">"Mice"</span> <span class="n">mouse</span>
   <span class="n">t</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">pure</span> <span class="p">(</span><span class="n">catMaybes</span> <span class="p">[</span><span class="n">f</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">])</span>
</code></pre></div></div>

<p>The only change we have to make is returning the final array using <code class="language-plaintext highlighter-rouge">catMaybes</code> to compress <code class="language-plaintext highlighter-rouge">Array (Maybe a)</code> into <code class="language-plaintext highlighter-rouge">Array a</code>.</p>

<p>What happens if we inspect this program?</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="o">&gt;</span> <span class="n">snd</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog2_wrong</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get1</span><span class="p">,</span><span class="n">put</span><span class="o">:</span><span class="n">put1</span><span class="p">}</span> <span class="s">"a"</span>
<span class="kt">Uncaught</span> <span class="kt">Error</span><span class="o">:</span> <span class="kt">Failed</span> <span class="n">pattern</span> <span class="n">match</span> <span class="n">at</span> <span class="kt">Data</span><span class="o">.</span><span class="kt">Maybe</span> <span class="n">line</span> <span class="o">...</span>
</code></pre></div></div>

<p>Whoops! Purescript is not lazy, so it tries to interpret the <code class="language-plaintext highlighter-rouge">"oops!"</code>s as <code class="language-plaintext highlighter-rouge">Maybe a</code>s because it wants to know if it is a <code class="language-plaintext highlighter-rouge">Just a</code> or <code class="language-plaintext highlighter-rouge">Nothing</code>, due to the <code class="language-plaintext highlighter-rouge">catMaybes</code> call, even though we never requested to calculate the result of the computation…</p>

<p>When using Haskell, this problem shouldn’t surface because it is lazy by default. And if we never request the result array, the dark secret won’t be revealed.</p>

<p>A solution in Purescript is to use <a href="https://github.com/purescript/purescript-lazy">opt-in laziness</a> and create a thunk out of the result array:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">prog2_lazy</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">f</span> <span class="n">r</span> <span class="n">a</span><span class="o">.</span>
              <span class="kt">Monad</span> <span class="n">f</span> <span class="o">=&gt;</span>
              <span class="p">{</span> <span class="n">get</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Maybe</span> <span class="n">a</span><span class="p">)</span>
              <span class="p">,</span> <span class="n">put</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="kt">Unit</span> <span class="o">|</span> <span class="n">r</span> <span class="p">}</span> <span class="o">-&gt;</span>
              <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Lazy</span> <span class="p">(</span><span class="kt">Array</span> <span class="n">a</span><span class="p">))</span>
<span class="n">prog2_lazy</span> <span class="n">k</span> <span class="n">mouse</span> <span class="o">=</span> <span class="kr">do</span>
   <span class="n">f</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">s</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Dogs"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">put</span> <span class="s">"Mice"</span> <span class="n">mouse</span>
   <span class="n">t</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">pure</span> <span class="p">(</span><span class="n">defer</span> <span class="p">(</span><span class="nf">\</span><span class="kr">_</span> <span class="o">-&gt;</span> <span class="n">catMaybes</span> <span class="p">[</span><span class="n">f</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">]))</span>
</code></pre></div></div>

<p>Which makes the example work again:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="o">&gt;</span> <span class="n">snd</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog2_lazy</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get1</span><span class="p">,</span> <span class="n">put</span><span class="o">:</span><span class="n">put1</span><span class="p">}</span> <span class="mi">1</span>
<span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">(</span><span class="s">"Cats"</span> <span class="o">:</span> <span class="s">"Dogs"</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">))</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">((</span><span class="kt">Tuple</span> <span class="s">"Mice"</span> <span class="mi">1</span><span class="p">)</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">)))</span>
</code></pre></div></div>

<h1 id="applicability">Applicability</h1>

<p>So, why go through the trouble to use this unsafe trick when a perfectly viable alternative exists?
The reason is that the alternative is not as perfect as it seems on first sight.</p>

<p>Categorizing computations as applicative or monadic is very coarse-grained.
This results in <code class="language-plaintext highlighter-rouge">Monad</code> constraints popping up in all sorts of situations, which disables the applicative inspection.
But it doesn’t mean that these programs are not inspectable at all.
In some sense this coarse modeling of computations results in the type system preventing us of running some inspections we would want to do.</p>

<p>Take <code class="language-plaintext highlighter-rouge">prog3</code> for example:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">prog3</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">f</span> <span class="n">r</span> <span class="n">a</span><span class="o">.</span>
         <span class="kt">Monad</span> <span class="n">f</span> <span class="o">=&gt;</span>
         <span class="p">{</span> <span class="n">get</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span>
         <span class="p">,</span> <span class="n">put</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="kt">Unit</span> <span class="o">|</span> <span class="n">r</span> <span class="p">}</span> <span class="o">-&gt;</span>
         <span class="n">f</span> <span class="p">(</span><span class="kt">Array</span> <span class="n">a</span><span class="p">)</span>
<span class="n">prog3</span> <span class="n">k</span> <span class="o">=</span> <span class="kr">do</span>
   <span class="n">f</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">s</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Dogs"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">put</span> <span class="s">"Mice"</span> <span class="n">f</span>
   <span class="n">t</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">pure</span> <span class="p">[</span><span class="n">f</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">]</span>
</code></pre></div></div>

<p>The difference with <code class="language-plaintext highlighter-rouge">prog1</code> is that we pass the value <code class="language-plaintext highlighter-rouge">f</code> from <code class="language-plaintext highlighter-rouge">k.get "Cats"</code> to <code class="language-plaintext highlighter-rouge">k.put "Mice" f</code>.
Obviously, we cannot inspect this computation to return the values of all puts, they are not statically known.
But, we are able to inspect all locations which will be touched by only gathering the keys.
We can easily adapt the handler:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">get2</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">))</span> <span class="n">a</span>
<span class="n">get2</span> <span class="n">key</span> <span class="o">=</span> <span class="n">writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="n">undef</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">singleton</span> <span class="n">key</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">empty</span><span class="p">)))</span>

<span class="n">put2</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">a</span><span class="o">.</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="kt">Set</span> <span class="kt">String</span><span class="p">))</span> <span class="n">a</span>
<span class="n">put2</span> <span class="n">key</span> <span class="n">value</span> <span class="o">=</span> <span class="n">writer</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="n">undef</span> <span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">empty</span><span class="p">)</span> <span class="p">(</span><span class="kt">S</span><span class="o">.</span><span class="n">singleton</span> <span class="n">key</span><span class="p">)))</span>
</code></pre></div></div>

<p>We see the sets [“Cats”, “Dogs”] and [“Mice”] as result of our inspection:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> <span class="n">snd</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog3</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get2</span><span class="p">,</span> <span class="n">put</span><span class="o">:</span><span class="n">put2</span><span class="p">}</span>
<span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">(</span><span class="s">"Cats"</span> <span class="o">:</span> <span class="s">"Dogs"</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">))</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">(</span><span class="s">"Mice"</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">)))</span>
</code></pre></div></div>

<p>Another example of a <code class="language-plaintext highlighter-rouge">Monad</code> constraint popping up is when we add some logging to our computation:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">prog4</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">f</span> <span class="n">r</span> <span class="n">a</span><span class="o">.</span>
         <span class="kt">Monad</span> <span class="n">f</span> <span class="o">=&gt;</span>
         <span class="kt">Show</span> <span class="n">a</span> <span class="o">=&gt;</span>
         <span class="p">{</span> <span class="n">get</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span>
         <span class="p">,</span> <span class="n">put</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="kt">Unit</span>
         <span class="p">,</span> <span class="n">log</span> <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="kt">Unit</span> <span class="o">|</span> <span class="n">r</span> <span class="p">}</span> <span class="o">-&gt;</span>
         <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Array</span> <span class="n">a</span><span class="p">)</span>
<span class="n">prog4</span> <span class="n">k</span> <span class="n">mouse</span> <span class="o">=</span> <span class="kr">do</span>
   <span class="n">f</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">log</span> <span class="p">(</span><span class="s">"Cats: "</span> <span class="o">&lt;&gt;</span> <span class="n">show</span> <span class="n">f</span><span class="p">)</span>
   <span class="n">s</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Dogs"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">log</span> <span class="p">(</span><span class="s">"Dogs: "</span> <span class="o">&lt;&gt;</span> <span class="n">show</span> <span class="n">s</span><span class="p">)</span>
   <span class="n">k</span><span class="o">.</span><span class="n">put</span> <span class="s">"Mice"</span> <span class="n">mouse</span>
   <span class="n">t</span> <span class="o">&lt;-</span> <span class="n">k</span><span class="o">.</span><span class="n">get</span> <span class="s">"Cats"</span>
   <span class="n">k</span><span class="o">.</span><span class="n">log</span> <span class="p">(</span><span class="s">"Cats: "</span> <span class="o">&lt;&gt;</span> <span class="n">show</span> <span class="n">t</span><span class="p">)</span>
   <span class="n">pure</span> <span class="p">[</span><span class="n">f</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">]</span>
</code></pre></div></div>

<p>I am aware that we could rewrite the program to fit the applicative inspection style, but it feels quite awkward that this is necessary.</p>

<p>By essentially turning off the logging to prevent any errors from surfacing (although I don’t think it is a problem even if it actually logged things):</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">log1</span> <span class="o">::</span> <span class="n">forall</span> <span class="n">f</span> <span class="n">a</span><span class="o">.</span> <span class="kt">Applicative</span> <span class="n">f</span> <span class="o">=&gt;</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="n">f</span> <span class="n">a</span>
<span class="n">log1</span> <span class="n">s</span> <span class="o">=</span> <span class="n">pure</span> <span class="n">undef</span>
</code></pre></div></div>

<p>We can analyze the computation as well, without having to modify its definition:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> <span class="n">snd</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog4</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get1</span><span class="p">,</span> <span class="n">put</span><span class="o">:</span><span class="n">put1</span><span class="p">,</span> <span class="n">log</span><span class="o">:</span><span class="n">log1</span><span class="p">}</span> <span class="mi">1</span>
<span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">(</span><span class="s">"Cats"</span> <span class="o">:</span> <span class="s">"Dogs"</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">))</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">((</span><span class="kt">Tuple</span> <span class="s">"Mice"</span> <span class="mi">1</span><span class="p">)</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">)))</span>
</code></pre></div></div>

<p>There are more situations this applies to, but hopefully the point is clear.</p>

<h1 id="mismatching-handler-and-computation">Mismatching handler and computation</h1>

<p>I want to highlight the fact that if we mismatch a handler and computation we will get into weird behaviour territory as well.
This is in fact the main issue I see with actually using this trick.
You are essentially throwing away the safety given by the type system to apply this trick.</p>

<p>For example inspecting <code class="language-plaintext highlighter-rouge">prog3</code> with <code class="language-plaintext highlighter-rouge">get1</code> and <code class="language-plaintext highlighter-rouge">put1</code>, which assume that all <code class="language-plaintext highlighter-rouge">put</code> values are statically available will result in an erroneous value since the computation will catch the unsafe <code class="language-plaintext highlighter-rouge">undef</code> value.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> <span class="n">snd</span> <span class="o">$</span> <span class="n">runWriter</span> <span class="o">$</span> <span class="n">prog3</span> <span class="p">{</span><span class="n">get</span><span class="o">:</span><span class="n">get1</span><span class="p">,</span> <span class="n">put</span><span class="o">:</span><span class="n">put1</span><span class="p">}</span>
<span class="p">(</span><span class="kt">Tuple</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">(</span><span class="s">"Cats"</span> <span class="o">:</span> <span class="s">"Dogs"</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">))</span> <span class="p">(</span><span class="n">fromFoldable</span> <span class="p">((</span><span class="kt">Tuple</span> <span class="s">"Mice"</span> <span class="n">oops</span><span class="o">!</span><span class="p">)</span> <span class="o">:</span> <span class="kt">Nil</span><span class="p">)))</span>
</code></pre></div></div>

<p>Notice the <code class="language-plaintext highlighter-rouge">"oops!"</code> value in the second set, if it was used as an <code class="language-plaintext highlighter-rouge">Int</code> it would most likely result in a runtime error somewhere.</p>

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

<p>I think this trick highlights possibilities for alternative categorizations of computations, which are more fine-grained than applicative/monad, in fact also more fine-grained than applicative/arrow/monad.
The actual trick in itself, due to it actively cheating the type system, should probably not be used in practice however.</p>

<p>You can check out the full code in <a href="https://gist.github.com/rubenpieters/42fd378331a7282ea5e7efd31c92d610">this gist</a>, which can be pasted into <a href="http://try.purescript.org">Try Purescript</a> to run it.</p>]]></content><author><name>rubenpieters</name></author><category term="Programming" /><category term="Purescript" /><summary type="html"><![CDATA[After some discussion on reddit following Luka’s post on optimizing tagless final computations, I realized a trick for inspecting monadic programs, but in an unsafe manner. Luka’s technique of optimizing computations is rooted in the idea of the analyzeFreeAp function of the Free Applicative (or runAp_ in Haskell’s free package). This idea is applied in the context of tagless final programs, but the fact still remains that it is a safe way of inspecting programs. Safe meaning that whatever handler we write, it can be applied to applicative programs without any runtime error. Unsafe in this context means that we will be cheating the type system and as a result runtime errors might surface when the wrong handler is combined with the wrong program.]]></summary></entry><entry><title type="html">Induction for Point-Free Equational Reasoning</title><link href="rubenpieters.github.io/induction/equationalreasoning/2017/08/23/induction-pointfree-1.html" rel="alternate" type="text/html" title="Induction for Point-Free Equational Reasoning" /><published>2017-08-23T00:00:00+00:00</published><updated>2017-08-23T00:00:00+00:00</updated><id>rubenpieters.github.io/induction/equationalreasoning/2017/08/23/induction-pointfree-1</id><content type="html" xml:base="rubenpieters.github.io/induction/equationalreasoning/2017/08/23/induction-pointfree-1.html"><![CDATA[<p>In standard equational reasoning we can make use of inductive proofs. We declare that we want to do induction on one of the variables and assume an induction hypothesis which let’s us prove a certain property.</p>

<p>For example with a definition of the natural numbers:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Nat</span> <span class="o">=</span> <span class="kt">Zero</span> <span class="o">|</span> <span class="kt">S</span> <span class="kt">Nat</span>
</code></pre></div></div>

<p>And some functions:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- returns whether a natural number is even</span>
<span class="n">even'</span> <span class="o">::</span> <span class="kt">Nat</span> <span class="o">-&gt;</span> <span class="kt">Bool</span>
<span class="n">even'</span> <span class="kt">Zero</span> <span class="o">=</span> <span class="kt">True</span>
<span class="n">even'</span> <span class="p">(</span><span class="kt">S</span> <span class="n">n</span><span class="p">)</span> <span class="o">=</span> <span class="n">not</span> <span class="p">(</span><span class="n">even'</span> <span class="n">n</span><span class="p">)</span>

<span class="c1">-- returns 2* the input natural number</span>
<span class="n">times2</span> <span class="o">::</span> <span class="kt">Nat</span> <span class="o">-&gt;</span> <span class="kt">Nat</span>
<span class="n">times2</span> <span class="kt">Zero</span> <span class="o">=</span> <span class="kt">Zero</span>
<span class="n">times2</span> <span class="p">(</span><span class="kt">S</span> <span class="n">n</span><span class="p">)</span> <span class="o">=</span> <span class="kt">S</span> <span class="p">(</span><span class="kt">S</span> <span class="p">(</span><span class="n">times2</span> <span class="n">n</span><span class="p">))</span>
</code></pre></div></div>

<p>We can prove that <code class="language-plaintext highlighter-rouge">even' (times2 x)</code> evaluates to <code class="language-plaintext highlighter-rouge">True</code> for all <code class="language-plaintext highlighter-rouge">x</code> by induction on <code class="language-plaintext highlighter-rouge">x</code>. Let’s try that:</p>

<p>We have two cases. First we need to prove that it holds when <code class="language-plaintext highlighter-rouge">x = Zero</code></p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">even'</span> <span class="p">(</span><span class="n">times2</span> <span class="kt">Zero</span><span class="p">)</span>
<span class="c1">-- definition times2</span>
<span class="o">=</span> <span class="n">even'</span> <span class="kt">Zero</span>
<span class="c1">-- definition even'</span>
<span class="o">=</span> <span class="kt">True</span>
</code></pre></div></div>

<p>For <code class="language-plaintext highlighter-rouge">X = S n</code> we prove <code class="language-plaintext highlighter-rouge">even' (times2 n) = True</code> implies <code class="language-plaintext highlighter-rouge">even' (times2 (S n)) = True</code>.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">even'</span> <span class="p">(</span><span class="n">times2</span> <span class="p">(</span><span class="kt">S</span> <span class="n">n</span><span class="p">))</span>
<span class="c1">-- definition times2</span>
<span class="o">=</span> <span class="n">even'</span> <span class="p">(</span><span class="kt">S</span> <span class="p">(</span><span class="kt">S</span> <span class="p">(</span><span class="n">times2</span> <span class="n">n</span><span class="p">)))</span>
<span class="c1">-- definition even'</span>
<span class="o">=</span> <span class="n">not</span> <span class="p">(</span><span class="n">even'</span> <span class="p">(</span><span class="kt">S</span> <span class="p">(</span><span class="n">times2</span> <span class="n">n</span><span class="p">)))</span>
<span class="c1">-- definition even'</span>
<span class="o">=</span> <span class="n">not</span> <span class="p">(</span><span class="n">not</span> <span class="p">(</span><span class="n">even'</span> <span class="p">(</span><span class="n">times2</span> <span class="n">n</span><span class="p">)))</span>
<span class="c1">-- property of not</span>
<span class="o">=</span> <span class="n">even'</span> <span class="p">(</span><span class="n">times2</span> <span class="n">n</span><span class="p">)</span>
<span class="c1">-- using induction hypothesis</span>
<span class="o">=</span> <span class="kt">True</span>
</code></pre></div></div>

<p>Having proven the property for both cases we have given a proof that <code class="language-plaintext highlighter-rouge">even' (times2 x) = True</code> for all <code class="language-plaintext highlighter-rouge">x</code> by induction.</p>

<p>In point-free equational reasoning however there are no ‘points’, there are no variables on which we can declare induction. But we would still like to be able to prove certain things in a similar manner.</p>

<p>So our earlier property written point-free is <code class="language-plaintext highlighter-rouge">even' . times2 = const True</code>, but how can we argue that this property holds? There is no <code class="language-plaintext highlighter-rouge">x</code> on which we can declare induction…</p>

<h1 id="initiality-and-f-algebras">Initiality and $F$-Algebras</h1>

<p>To correctly state our proof some mathematical concepts are to be introduced. I assume some basic familiarity with category theory, so I won’t reintroduce the definitions of a category or functor here. (If you are not familiar though, my suggestion would be to take a look at Bartosz’ <a href="https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/">category theory for programmers</a>)</p>

<p><strong>Initial Object</strong> An initial object is an object with a unique morphism to every other object. This uniqueness is an essential property we will use to prove that two morphisms are equal.</p>

<p><strong>$F$-Algebra</strong> $F$-Algebras are composed of two things: a carrier $A$ and an action $a : FA \rightarrow A$, where $F$ is an endofunctor. I will use the notation $\langle A, a \rangle$ for $F$-Algebras.</p>

<p>Algebra homomorphisms are then functions on the underlying carriers which adhere to a special condition. A function $f : A \rightarrow B$ is an algebra homomorphism from $\langle A, a \rangle$ to $\langle B, b \rangle$ if $f \circ a = b \circ Ff$.</p>

\[\begin{CD}
FA @&gt;Ff&gt;&gt; FB\\
@VaVV @VVbV\\
A @&gt;f&gt;&gt; B
\end{CD}\]

<p>(For a more in-depth read on $F$-Algebras I suggest to read <a href="https://www.schoolofhaskell.com/user/bartosz/understanding-algebras">this post</a> by Bartosz)</p>

<p>It turns out that $F$-Algebras and algebra homomorphisms form a category with the former as objects and the latter as morphisms. And in this category we have an initial object, the initial $F$-Algebra.</p>

<p><strong>Coproduct</strong> One other thing I want to point out is the notation I will use for the universal property of coproducts. If we have morphisms $f : A \rightarrow X$ and $g : B \rightarrow X$ then I will use $[f, g] : A + B \rightarrow X$ to denote the universal property of the coproduct.</p>

\[\begin{CD}
A @&gt;f&gt;&gt; X @&lt;g&lt;&lt; B\\
@V\mathit{inl}VV @AA[f,g]A @VV\mathit{inr}V\\
@&gt;&gt;&gt; A+B @&lt;&lt;&lt;
\end{CD}\]

<p>An example of this is pattern matching on <code class="language-plaintext highlighter-rouge">Either</code>:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">coproduct</span> <span class="o">::</span> <span class="p">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">x</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">b</span> <span class="o">-&gt;</span> <span class="n">x</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">Either</span> <span class="n">a</span> <span class="n">b</span> <span class="o">-&gt;</span> <span class="n">x</span><span class="p">)</span>
<span class="n">coproduct</span> <span class="n">f</span> <span class="kr">_</span> <span class="p">(</span><span class="kt">Left</span> <span class="n">a</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span> <span class="n">a</span>
<span class="n">coproduct</span> <span class="kr">_</span> <span class="n">g</span> <span class="p">(</span><span class="kt">Right</span> <span class="n">b</span><span class="p">)</span> <span class="o">=</span> <span class="n">g</span> <span class="n">b</span>
</code></pre></div></div>

<p>To prove our example shown in the first section we actually only need to work with one functor, namely the one for which natural numbers are the initial algebra (with $[\mathit{zero}, \mathit{succ}]$ as action). This functor is $1 + X$, which instantiated as a Haskell <code class="language-plaintext highlighter-rouge">Functor</code> is <code class="language-plaintext highlighter-rouge">Either () a</code>.</p>

<p>Our initial algebra is then $\langle\mathbb{N}, [\mathit{zero}, \mathit{succ}] : 1 + \mathbb{N} \rightarrow \mathbb{N} \rangle$. Initiality for the $1 + X$ functor means the following diagram holds for any algebra $\langle B, [\phi_1, \phi_2] : 1 + B \rightarrow B \rangle$ (where $f$ is the <strong>unique</strong> morphism which makes the diagram commute):</p>

\[\begin{CD}
1+\mathbb{N} @&gt;id_1+f&gt;&gt; 1+B\\
@V[\mathit{zero}, \mathit{succ}]VV @VV[\phi_1, \phi_2]V\\
\mathbb{N} @&gt;f&gt;&gt; B
\end{CD}\]

<p>Which is actually equivalent to the following two diagrams:</p>

\[\begin{CD}
1 @= 1\\
@V\mathit{zero}VV @VV\phi_1V\\
\mathbb{N} @&gt;f&gt;&gt; B
\end{CD}\]

\[\begin{CD}
\mathbb{N} @&gt;f&gt;&gt; B\\
@V\mathit{succ}VV @VV\phi_2V\\
\mathbb{N} @&gt;f&gt;&gt; B
\end{CD}\]

<p>or in equations:</p>

<ul>
  <li>$f \circ \mathit{zero} = \phi_1$</li>
  <li>$f \circ \mathit{succ} = \phi_2 \circ f$</li>
</ul>

<p>So we will tackle our problem by proving that we have two different morphisms which satisfy these equations, but because we know $f$ is unique we know they must be equal.</p>

<h1 id="point-free-induction">Point-Free Induction</h1>

<p>The <code class="language-plaintext highlighter-rouge">Either () a</code> functor from earlier is also isomorphic to the following data type, defined for convenience:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">NatF</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">ZeroF</span> <span class="o">|</span> <span class="kt">SF</span> <span class="n">a</span>

<span class="kr">instance</span> <span class="kt">Functor</span> <span class="kt">NatF</span> <span class="kr">where</span>
  <span class="n">fmap</span> <span class="n">f</span> <span class="kt">ZeroF</span> <span class="o">=</span> <span class="kt">ZeroF</span>
  <span class="n">fmap</span> <span class="n">f</span> <span class="p">(</span><span class="kt">SF</span> <span class="n">a</span><span class="p">)</span> <span class="o">=</span> <span class="kt">SF</span> <span class="p">(</span><span class="n">f</span> <span class="n">a</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Maybe</code> you have seen this functor somewhere else.</p>

<p>Anyways, to create an initial algebra we also need an action:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">inNatF</span> <span class="o">::</span> <span class="kt">NatF</span> <span class="kt">Nat</span> <span class="o">-&gt;</span> <span class="kt">Nat</span>
<span class="n">inNatF</span> <span class="kt">ZeroF</span> <span class="o">=</span> <span class="kt">Zero</span>
<span class="n">inNatF</span> <span class="p">(</span><span class="kt">SF</span> <span class="n">n</span><span class="p">)</span> <span class="o">=</span> <span class="kt">S</span> <span class="n">n</span>
</code></pre></div></div>

<p>Or in coproduct notation $[$<code class="language-plaintext highlighter-rouge">const Zero</code>, <code class="language-plaintext highlighter-rouge">S</code>$] :$ <code class="language-plaintext highlighter-rouge">NatF Nat -&gt; Nat</code>. These two together create our initial algebra $\langle$<code class="language-plaintext highlighter-rouge">Nat</code>, $[$<code class="language-plaintext highlighter-rouge">const Zero</code>, <code class="language-plaintext highlighter-rouge">S</code>$] : $ <code class="language-plaintext highlighter-rouge">NatF Nat -&gt; Nat</code> $\rangle$. ($\mathit{zero}$ = <code class="language-plaintext highlighter-rouge">const Zero</code>, $\mathit{succ}$ = <code class="language-plaintext highlighter-rouge">S</code>)</p>

<p>This initial algebra has a unique algebra homomorphism to any other algebra for our functor. Let’s take the algebra $\langle$<code class="language-plaintext highlighter-rouge">Bool</code>, $[$<code class="language-plaintext highlighter-rouge">const True</code>, <code class="language-plaintext highlighter-rouge">id</code>$] : $ <code class="language-plaintext highlighter-rouge">NatF Bool -&gt; Bool</code> $\rangle$, which we will need in our upcoming proof. ($\phi_1$ = <code class="language-plaintext highlighter-rouge">const True</code>, $\phi_2$ = <code class="language-plaintext highlighter-rouge">id</code>)</p>

<p>By initiality we have the unique function <code class="language-plaintext highlighter-rouge">f : Nat -&gt; Bool</code> where the following two equations hold:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">f . const Zero = const True</code></li>
  <li><code class="language-plaintext highlighter-rouge">f . S = id . f</code></li>
</ul>

<p>So intuitively speaking <code class="language-plaintext highlighter-rouge">f</code> is <code class="language-plaintext highlighter-rouge">True</code> when applied to <code class="language-plaintext highlighter-rouge">Zero</code> and then <code class="language-plaintext highlighter-rouge">f</code> applied on any successor <code class="language-plaintext highlighter-rouge">Nat</code> is equal to the result of its predecessor, so it results in always being <code class="language-plaintext highlighter-rouge">True</code>.</p>

<p>And indeed plugging in <code class="language-plaintext highlighter-rouge">const True</code> for <code class="language-plaintext highlighter-rouge">f</code> makes the two equations work out:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">const</span> <span class="kt">True</span><span class="p">)</span> <span class="o">.</span> <span class="p">(</span><span class="n">const</span> <span class="kt">Zero</span><span class="p">)</span>
<span class="o">=</span> <span class="n">const</span> <span class="kt">True</span>
</code></pre></div></div>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">const</span> <span class="kt">True</span><span class="p">)</span> <span class="o">.</span> <span class="kt">S</span>
<span class="o">=</span> <span class="n">const</span> <span class="kt">True</span>
<span class="o">=</span> <span class="n">id</span> <span class="o">.</span> <span class="p">(</span><span class="n">const</span> <span class="kt">True</span><span class="p">)</span>
</code></pre></div></div>

<p>So this seems like a step in the right direction. If we can show that the <code class="language-plaintext highlighter-rouge">even' . times2</code> function is also an algebra homomorphism to this algebra then by uniqueness we can conclude that they are the same function and our proof is complete!</p>

<p>And indeed substituting <code class="language-plaintext highlighter-rouge">f</code> for <code class="language-plaintext highlighter-rouge">even' . times2</code> makes the equations work out as well (we do have to adopt a point-free style for the <code class="language-plaintext highlighter-rouge">even'</code> and <code class="language-plaintext highlighter-rouge">times2</code> functions, but they are still the same):</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">even'</span> <span class="o">.</span> <span class="n">times2</span> <span class="o">.</span> <span class="p">(</span><span class="n">const</span> <span class="kt">Zero</span><span class="p">)</span>
<span class="c1">-- definition times2</span>
<span class="o">=</span> <span class="n">even'</span> <span class="o">.</span> <span class="p">(</span><span class="n">const</span> <span class="kt">Zero</span><span class="p">)</span>
<span class="c1">-- definition even'</span>
<span class="o">=</span> <span class="n">const</span> <span class="kt">True</span>
</code></pre></div></div>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">even'</span> <span class="o">.</span> <span class="n">times2</span> <span class="o">.</span> <span class="kt">S</span>
<span class="c1">-- definition times2</span>
<span class="o">=</span> <span class="n">even'</span> <span class="o">.</span> <span class="kt">S</span> <span class="o">.</span> <span class="kt">S</span> <span class="o">.</span> <span class="n">times2</span>
<span class="c1">-- definition even'</span>
<span class="o">=</span> <span class="n">not</span> <span class="o">.</span> <span class="n">even'</span> <span class="o">.</span> <span class="kt">S</span> <span class="o">.</span> <span class="n">times2</span>
<span class="c1">-- definition even'</span>
<span class="o">=</span> <span class="n">not</span> <span class="o">.</span> <span class="n">not</span> <span class="o">.</span> <span class="n">even'</span> <span class="o">.</span> <span class="n">times2</span>
<span class="c1">-- property of not</span>
<span class="o">=</span> <span class="n">even'</span> <span class="o">.</span> <span class="n">times2</span>
<span class="c1">-- introduce id</span>
<span class="o">=</span> <span class="n">id</span> <span class="o">.</span> <span class="n">even'</span> <span class="o">.</span> <span class="n">times2</span>
</code></pre></div></div>

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

<p>So if you’ve ever wondered how initial algebras provide the framework for induction, in this post we explored an example illustrated with Haskell by applying the underlying theory for initiality of initial algebras.</p>

<p>When I was trying to figure out how this worked I couldn’t really find any source explaining it in enough detail for me to understand it from the ground up, so I decided to write this up.</p>]]></content><author><name>rubenpieters</name></author><category term="Induction" /><category term="EquationalReasoning" /><summary type="html"><![CDATA[In standard equational reasoning we can make use of inductive proofs. We declare that we want to do induction on one of the variables and assume an induction hypothesis which let’s us prove a certain property.]]></summary></entry><entry><title type="html">Type Families in Scala - Typed sprintf</title><link href="rubenpieters.github.io/typefamilies/abstracttypes/2017/03/21/type-families-in-scala-1.html" rel="alternate" type="text/html" title="Type Families in Scala - Typed sprintf" /><published>2017-03-21T00:00:00+00:00</published><updated>2017-03-21T00:00:00+00:00</updated><id>rubenpieters.github.io/typefamilies/abstracttypes/2017/03/21/type-families-in-scala-1</id><content type="html" xml:base="rubenpieters.github.io/typefamilies/abstracttypes/2017/03/21/type-families-in-scala-1.html"><![CDATA[<p>Lately I have been playing around a bit with porting some code samples from <a href="https://wiki.haskell.org/Simonpj/Talk:FunWithTypeFuns">Fun with Type Functions</a> to Scala. I will be referring to the pdf <code class="language-plaintext highlighter-rouge">typefun.pdf</code> linked there as ‘the pdf’.</p>

<p>I will explain how I did section 4.1 ‘Typed sprintf’.</p>

<h1 id="setting">Setting</h1>

<p>Let’s explain what we want to achieve (paraphrasing from the pdf).</p>

<p>We want to make a typed printing function inspired by the not type-safe C function <code class="language-plaintext highlighter-rouge">sprintf</code>.</p>

<p>What this function does is print out a formatted string, but it can take a variable amount of parameters to be printed as well.</p>

<p>So for example <code class="language-plaintext highlighter-rouge">sprintf("Name %s")</code> requires an extra <code class="language-plaintext highlighter-rouge">String</code> argument, so we would want it to be a <code class="language-plaintext highlighter-rouge">String =&gt; String</code>. But we would want <code class="language-plaintext highlighter-rouge">sprintf("Name=%s, Age=%d")</code> to be a <code class="language-plaintext highlighter-rouge">String =&gt; Int =&gt; String</code>, since it takes an extra <code class="language-plaintext highlighter-rouge">Int</code> parameter. I assume you can extrapolate some other examples yourself.</p>

<p>The pdf then goes on to explain how it can be encoded in Haskell using type families. I will show how I ported this code to Scala.</p>

<h1 id="representation">Representation</h1>

<p>We will represent what we want to print (in the pdf called an <code class="language-plaintext highlighter-rouge">F</code>) as follows:</p>

<ul>
  <li>We can request to print a literal, we call this <code class="language-plaintext highlighter-rouge">Lit</code>. It must also take a <code class="language-plaintext highlighter-rouge">String</code> argument, this is the literal we want to print</li>
  <li>We can request to print a value, we call this <code class="language-plaintext highlighter-rouge">Val</code>. This can have any type so we make it have a generic type. We also encode a way to print this value as an <code class="language-plaintext highlighter-rouge">A =&gt; String</code> function.</li>
  <li>We need to be able to represent arbitrary combinations of the previous two, we call this <code class="language-plaintext highlighter-rouge">Cmp</code>. With <code class="language-plaintext highlighter-rouge">Cmp</code> we can combine two <code class="language-plaintext highlighter-rouge">F</code>s to create a bigger <code class="language-plaintext highlighter-rouge">F</code>.</li>
</ul>

<p>We end up with this definition:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">sealed</span> <span class="k">trait</span> <span class="nc">F</span>
<span class="k">case</span> <span class="k">class</span> <span class="nc">Lit</span><span class="o">(</span><span class="n">str</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">extends</span> <span class="n">F</span>
<span class="k">case</span> <span class="k">class</span> <span class="nc">Val</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">printer</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="nc">String</span><span class="o">)</span> <span class="k">extends</span> <span class="n">F</span>
<span class="k">case</span> <span class="k">class</span> <span class="nc">Cmp</span><span class="o">[</span><span class="kt">F1</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">F2</span> <span class="k">&lt;:</span> <span class="kt">F</span><span class="o">](</span><span class="n">f1</span><span class="k">:</span> <span class="kt">F1</span><span class="o">,</span> <span class="n">f2</span><span class="k">:</span> <span class="kt">F2</span><span class="o">)</span> <span class="k">extends</span> <span class="n">F</span>
</code></pre></div></div>

<p>In this way we could encode the name/age example printing as follows:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">valInt</span> <span class="k">=</span> <span class="nc">Val</span><span class="o">[</span><span class="kt">Int</span><span class="o">](</span><span class="nv">_</span><span class="o">.</span><span class="py">toString</span><span class="o">)</span>
<span class="k">val</span> <span class="nv">valStr</span> <span class="k">=</span> <span class="nc">Val</span><span class="o">[</span><span class="kt">String</span><span class="o">](</span><span class="n">identity</span><span class="o">)</span>
<span class="k">val</span> <span class="nv">nameAge</span> <span class="k">=</span> <span class="nc">Cmp</span><span class="o">(</span><span class="nc">Cmp</span><span class="o">(</span><span class="nc">Lit</span><span class="o">(</span><span class="s">"name="</span><span class="o">),</span> <span class="n">valStr</span><span class="o">),</span> <span class="nc">Cmp</span><span class="o">(</span><span class="nc">Lit</span><span class="o">(</span><span class="s">", age="</span><span class="o">),</span> <span class="n">valInt</span><span class="o">))</span>
</code></pre></div></div>

<p>A little cumbersome, but it does the job.</p>

<p>Now our type family <code class="language-plaintext highlighter-rouge">TPrinter</code> will be represented like this:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">sealed</span> <span class="k">trait</span> <span class="nc">TPrinter</span><span class="o">[</span><span class="kt">A</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">X</span><span class="o">]</span> <span class="o">{</span>
   <span class="k">type</span> <span class="kt">Out</span>

   <span class="k">def</span> <span class="nf">print</span><span class="o">(</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span><span class="o">,</span> <span class="n">k</span><span class="k">:</span> <span class="kt">String</span> <span class="o">=&gt;</span> <span class="n">X</span><span class="o">)</span><span class="k">:</span> <span class="kt">Out</span>
<span class="o">}</span>
</code></pre></div></div>

<p>We can see this as: given a type <code class="language-plaintext highlighter-rouge">A</code> and <code class="language-plaintext highlighter-rouge">X</code> we will have a type <code class="language-plaintext highlighter-rouge">Out</code> corresponding to it. A type-level function in a way.</p>

<p>Our <code class="language-plaintext highlighter-rouge">TPrinter</code> also has a function <code class="language-plaintext highlighter-rouge">print</code> which takes an <code class="language-plaintext highlighter-rouge">F</code> (our representation to print) and a <code class="language-plaintext highlighter-rouge">k : String =&gt; X</code>. It will then return something of type <code class="language-plaintext highlighter-rouge">Out</code>, which in the name/age example should be <code class="language-plaintext highlighter-rouge">String =&gt; Int =&gt; String</code>.</p>

<p>The function <code class="language-plaintext highlighter-rouge">k</code> will be <code class="language-plaintext highlighter-rouge">String =&gt; String</code> (or <code class="language-plaintext highlighter-rouge">identity</code>) at the top level, but will become more important when we get to the implementation of the <code class="language-plaintext highlighter-rouge">Cmp</code> case for printing.</p>

<p>We’re also gonna be using the <a href="http://stackoverflow.com/questions/38541271/what-does-the-aux-pattern-accomplish-in-scala"><code class="language-plaintext highlighter-rouge">Aux</code> pattern</a> to be able to refer to the <code class="language-plaintext highlighter-rouge">Out</code> type in implicit parameters:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">object</span> <span class="nc">TPrinter</span> <span class="o">{</span>
  <span class="k">type</span> <span class="kt">Aux</span><span class="o">[</span><span class="kt">A</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">X</span>, <span class="kt">Out0</span><span class="o">]</span> <span class="k">=</span> <span class="nc">TPrinter</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">X</span><span class="o">]</span> <span class="o">{</span> <span class="k">type</span> <span class="kt">Out</span> <span class="o">=</span> <span class="nc">Out0</span> <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h1 id="implementing-the-type-family">Implementing the Type Family</h1>

<p>Remember when I referred to the the type family as a type-level function? This might come across clearer when you see what behaviour we expect:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// some example behaviour:</span>
<span class="c1">// given a Lit and a String, we want to receive type String</span>
<span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">String</span>, <span class="kt">String</span><span class="o">]]</span>
<span class="c1">// but also: given a Lit and an Int =&gt; String, we want to receive type Int =&gt; String</span>
<span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span>, <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">]]</span>
<span class="c1">// given a Val[Int] and a String, we want to receive type Int =&gt; String</span>
<span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Val</span><span class="o">[</span><span class="kt">Int</span><span class="o">]</span>, <span class="kt">String</span>, <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">]]</span>
<span class="c1">// but also: given a Val[Int] and an Int =&gt; String, we want to receive type Int =&gt; Int =&gt; String</span>
<span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Val</span><span class="o">[</span><span class="kt">Int</span><span class="o">]</span>, <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span>, <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">]]</span>
<span class="c1">// given a Cmp[Lit, Val[Int]] and a String we want to receive type Int =&gt; String</span>
<span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">Val</span><span class="o">[</span><span class="kt">Int</span><span class="o">]]</span>, <span class="kt">String</span>, <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">]]</span>
<span class="c1">// given a Cmp[Cmp[Lit, Val[String]], Cmp[Lit, Val[Int]]]</span>
<span class="c1">//   and a String we want to receive type String =&gt; Int =&gt; String</span>
<span class="c1">// notice this first type has the same type as `nameAge`</span>
<span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">Val</span><span class="o">[</span><span class="kt">String</span><span class="o">]]</span>, <span class="kt">Cmp</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">Val</span><span class="o">[</span><span class="kt">Int</span><span class="o">]]]</span>,
           <span class="kt">String</span>, <span class="kt">String</span> <span class="k">=&gt;</span> <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">]]</span>
</code></pre></div></div>

<p>More generally we want the following to hold:</p>

<p>When we have <code class="language-plaintext highlighter-rouge">A</code> = <code class="language-plaintext highlighter-rouge">Lit</code> then <code class="language-plaintext highlighter-rouge">Out</code> = <code class="language-plaintext highlighter-rouge">X</code>. A literal doesn’t change the type of our <code class="language-plaintext highlighter-rouge">print</code> function.</p>

<p>Implementing this is quite straightforward. The <code class="language-plaintext highlighter-rouge">print</code> function will execute the <code class="language-plaintext highlighter-rouge">k</code> on the given literal string.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">implicit</span> <span class="k">def</span> <span class="nf">tPrinterLit</span><span class="o">[</span><span class="kt">X</span><span class="o">]</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">X</span>, <span class="kt">X</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TPrinter</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">X</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">type</span> <span class="kt">Out</span> <span class="o">=</span> <span class="n">X</span>

  <span class="k">override</span> <span class="k">def</span> <span class="nf">print</span><span class="o">(</span><span class="n">f</span><span class="k">:</span> <span class="kt">Lit</span><span class="o">,</span> <span class="n">k</span><span class="k">:</span> <span class="o">(</span><span class="kt">String</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="n">X</span><span class="o">)</span><span class="k">:</span> <span class="kt">X</span> <span class="o">=</span> <span class="nf">k</span><span class="o">(</span><span class="nv">f</span><span class="o">.</span><span class="py">str</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>When we have <code class="language-plaintext highlighter-rouge">A</code> = <code class="language-plaintext highlighter-rouge">Val[V]</code> then <code class="language-plaintext highlighter-rouge">Out</code> = <code class="language-plaintext highlighter-rouge">V =&gt; X</code>. A value adds another typed parameter at the start of our function.</p>

<p>This is also fairly straightforward. We return a function which takes the typed parameter and when called will use the given <code class="language-plaintext highlighter-rouge">printer</code> to print this parameter as a <code class="language-plaintext highlighter-rouge">String</code>.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">implicit</span> <span class="k">def</span> <span class="nf">tPrinterVal</span><span class="o">[</span><span class="kt">X</span>, <span class="kt">A</span><span class="o">]</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Val</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span>, <span class="kt">X</span>, <span class="kt">A</span> <span class="k">=&gt;</span> <span class="kt">X</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TPrinter</span><span class="o">[</span><span class="kt">Val</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span>, <span class="kt">X</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">type</span> <span class="kt">Out</span> <span class="o">=</span> <span class="n">A</span> <span class="k">=&gt;</span> <span class="n">X</span>

  <span class="k">override</span> <span class="k">def</span> <span class="nf">print</span><span class="o">(</span><span class="n">f</span><span class="k">:</span> <span class="kt">Val</span><span class="o">[</span><span class="kt">A</span><span class="o">],</span> <span class="n">k</span><span class="k">:</span> <span class="o">(</span><span class="kt">String</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="n">X</span><span class="o">)</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="n">X</span> <span class="k">=</span>
    <span class="o">(</span><span class="n">x</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nf">k</span><span class="o">(</span><span class="nv">f</span><span class="o">.</span><span class="py">printer</span><span class="o">(</span><span class="n">x</span><span class="o">))</span>
<span class="o">}</span>
</code></pre></div></div>

<p>When we have <code class="language-plaintext highlighter-rouge">A</code> = <code class="language-plaintext highlighter-rouge">Cmp[F1, F2]</code> then <code class="language-plaintext highlighter-rouge">Out</code> = something which combines the output of the printer function for <code class="language-plaintext highlighter-rouge">F1</code> and <code class="language-plaintext highlighter-rouge">F2</code>.</p>

<p>Ouch this one seems a bit harder to express, let’s make the implementation and leave some generics open and see if the type checker can help us.</p>

<p>We will need the <code class="language-plaintext highlighter-rouge">TPrinter</code> instances for <code class="language-plaintext highlighter-rouge">F1</code> and <code class="language-plaintext highlighter-rouge">F2</code>. These will be <code class="language-plaintext highlighter-rouge">printerF1 : TPrinter.Aux[F1, XF1, OF1]</code> and <code class="language-plaintext highlighter-rouge">printerF2 : TPrinter.Aux[F2, XF2, OF2]</code>.</p>

<p>Eventually we will need to print the two sides and return an <code class="language-plaintext highlighter-rouge">X</code> again. This is <code class="language-plaintext highlighter-rouge">k(s1 + s2)</code> and has signature <code class="language-plaintext highlighter-rouge">endStr : String =&gt; String =&gt; X</code>.</p>

<p>If we have the first part as a <code class="language-plaintext highlighter-rouge">String</code> (let’s say <code class="language-plaintext highlighter-rouge">s1</code>) we can create the printer function for the second part by doing <code class="language-plaintext highlighter-rouge">printerF2.print(f.f2, s2 =&gt; endStr(s1, s2))</code>. This returns us the printer function determined by the second part <code class="language-plaintext highlighter-rouge">OF2</code>, so <code class="language-plaintext highlighter-rouge">print2 : String =&gt; OF2</code>.</p>

<p>Then we can create the definition for the overall printer function <code class="language-plaintext highlighter-rouge">printerF1.print(f.f1, s1 =&gt; print2(s1)</code>. This has type <code class="language-plaintext highlighter-rouge">OF1</code>, the output type of the first TPrinter.</p>

<p>Let’s write out the first attempt. We can see the type checker isn’t quite happy yet.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// WARNING: doesn't compile, for fixed version see below</span>
<span class="k">implicit</span> <span class="k">def</span> <span class="nf">tPrinterCmp</span><span class="o">[</span><span class="kt">X</span>, <span class="kt">F1</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">F2</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">XF1</span>, <span class="kt">XF2</span>, <span class="kt">OF1</span>, <span class="kt">OF2</span>, <span class="kt">OUT</span><span class="o">]</span>
  <span class="o">(</span> <span class="k">implicit</span> <span class="n">printerF1</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">XF1</span>, <span class="kt">OF1</span><span class="o">]</span>
  <span class="o">,</span> <span class="n">printerF2</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">F2</span>, <span class="kt">XF2</span>, <span class="kt">OF2</span><span class="o">]</span>
  <span class="o">)</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">F2</span><span class="o">]</span>, <span class="kt">X</span>, <span class="kt">OUT</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TPrinter</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">F2</span><span class="o">]</span>, <span class="kt">X</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">type</span> <span class="kt">Out</span> <span class="o">=</span> <span class="nc">OUT</span>

  <span class="k">override</span> <span class="k">def</span> <span class="nf">print</span><span class="o">(</span><span class="n">f</span><span class="k">:</span> <span class="kt">Cmp</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">F2</span><span class="o">],</span> <span class="n">k</span><span class="k">:</span> <span class="o">(</span><span class="kt">String</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="n">X</span><span class="o">)</span><span class="k">:</span> <span class="kt">OUT</span> <span class="o">=</span> <span class="o">{</span>
    <span class="k">def</span> <span class="nf">endStr</span><span class="o">(</span><span class="n">s1</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> <span class="n">s2</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">X</span> <span class="o">=</span> <span class="nf">k</span><span class="o">(</span><span class="n">s1</span> <span class="o">+</span> <span class="n">s2</span><span class="o">)</span>
    <span class="k">def</span> <span class="nf">print2</span><span class="o">(</span><span class="n">s1</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">=</span> <span class="nv">printerF2</span><span class="o">.</span><span class="py">print</span><span class="o">(</span><span class="nv">f</span><span class="o">.</span><span class="py">f2</span><span class="o">,</span>
	<span class="c1">// we have : String =&gt; XF2 , we need : String =&gt; X</span>
	  <span class="n">s2</span> <span class="k">=&gt;</span> <span class="nf">endStr</span><span class="o">(</span><span class="n">s1</span><span class="o">,</span> <span class="n">s2</span><span class="o">))</span>
    <span class="k">def</span> <span class="nf">print1</span> <span class="k">=</span> <span class="nv">printerF1</span><span class="o">.</span><span class="py">print</span><span class="o">(</span><span class="nv">f</span><span class="o">.</span><span class="py">f1</span><span class="o">,</span>
	<span class="c1">// we have : String =&gt; OF2 , we need : String =&gt; XF1</span>
	  <span class="n">s1</span> <span class="k">=&gt;</span> <span class="nf">print2</span><span class="o">(</span><span class="n">s1</span><span class="o">))</span>

	<span class="c1">// we have : OF1 , we need : OUT</span>
    <span class="n">print1</span>
  <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Following the guidance of the type checker gets us at the correct result, but let’s reason about it a little bit more.</p>

<p><code class="language-plaintext highlighter-rouge">OF2</code> will give us the type of the second part of the print function. This will be <code class="language-plaintext highlighter-rouge">(A =&gt;)* String</code>, where <code class="language-plaintext highlighter-rouge">()*</code> denotes zero or more occurrences.</p>

<p>We want the first printer part to add types at the start of the <code class="language-plaintext highlighter-rouge">OF2</code> type, as in <code class="language-plaintext highlighter-rouge">(B =&gt;)* (A =&gt;)* String</code>, this is <code class="language-plaintext highlighter-rouge">OF1</code>.</p>

<p>If <code class="language-plaintext highlighter-rouge">XF1</code> = <code class="language-plaintext highlighter-rouge">OF2</code> then we have the behaviour we want:</p>

<ul>
  <li>in case of <code class="language-plaintext highlighter-rouge">Lit</code>, <code class="language-plaintext highlighter-rouge">(B =&gt;)*</code> is empty and we get back <code class="language-plaintext highlighter-rouge">(A =&gt;)* String</code> for <code class="language-plaintext highlighter-rouge">OF1</code>.</li>
  <li>in case of 1 <code class="language-plaintext highlighter-rouge">Val[V]</code> we get back <code class="language-plaintext highlighter-rouge">V =&gt; (A =&gt;)* String</code> for <code class="language-plaintext highlighter-rouge">OF1</code></li>
  <li>etc…</li>
</ul>

<p>Then we can also see that <code class="language-plaintext highlighter-rouge">OUT</code> must be equal to <code class="language-plaintext highlighter-rouge">OF1</code>, since <code class="language-plaintext highlighter-rouge">OF1</code> is the output type we want for the printer function for the <code class="language-plaintext highlighter-rouge">Cmp</code> case.</p>

<p>Since there is no recursive lookup for the <code class="language-plaintext highlighter-rouge">tprinterF2</code> case our <code class="language-plaintext highlighter-rouge">XF2</code> must be <code class="language-plaintext highlighter-rouge">X</code>. Ok, this explanation isn’t that intuitive but the type checker insists on having it like this, so let’s comply.</p>

<p>Doing all the substitutions gives us:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">implicit</span> <span class="k">def</span> <span class="nf">tPrinterCmp</span><span class="o">[</span><span class="kt">X</span>, <span class="kt">F1</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">F2</span> <span class="k">&lt;:</span> <span class="kt">F</span>, <span class="kt">OF1</span>, <span class="kt">OF2</span><span class="o">]</span>
  <span class="o">(</span> <span class="k">implicit</span> <span class="n">printerF1</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">OF2</span>, <span class="kt">OF1</span><span class="o">]</span>
  <span class="o">,</span> <span class="n">printerF2</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">F2</span>, <span class="kt">X</span>, <span class="kt">OF2</span><span class="o">]</span>
  <span class="o">)</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">F2</span><span class="o">]</span>, <span class="kt">X</span>, <span class="kt">OF1</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TPrinter</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">F2</span><span class="o">]</span>, <span class="kt">X</span><span class="o">]</span> <span class="o">{</span>
    <span class="k">type</span> <span class="kt">Out</span> <span class="o">=</span> <span class="nc">OF1</span>

    <span class="k">override</span> <span class="k">def</span> <span class="nf">print</span><span class="o">(</span><span class="n">f</span><span class="k">:</span> <span class="kt">Cmp</span><span class="o">[</span><span class="kt">F1</span>, <span class="kt">F2</span><span class="o">],</span> <span class="n">k</span><span class="k">:</span> <span class="o">(</span><span class="kt">String</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="n">X</span><span class="o">)</span><span class="k">:</span> <span class="kt">OF1</span> <span class="o">=</span> <span class="o">{</span>
      <span class="k">def</span> <span class="nf">endStr</span><span class="o">(</span><span class="n">s1</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> <span class="n">s2</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">X</span> <span class="o">=</span> <span class="nf">k</span><span class="o">(</span><span class="n">s1</span> <span class="o">+</span> <span class="n">s2</span><span class="o">)</span>
      <span class="k">def</span> <span class="nf">print2</span><span class="o">(</span><span class="n">s1</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">=</span> <span class="nv">printerF2</span><span class="o">.</span><span class="py">print</span><span class="o">(</span><span class="nv">f</span><span class="o">.</span><span class="py">f2</span><span class="o">,</span> <span class="n">s2</span> <span class="k">=&gt;</span> <span class="nf">endStr</span><span class="o">(</span><span class="n">s1</span><span class="o">,</span> <span class="n">s2</span><span class="o">))</span>
      <span class="k">def</span> <span class="nf">print1</span> <span class="k">=</span> <span class="nv">printerF1</span><span class="o">.</span><span class="py">print</span><span class="o">(</span><span class="nv">f</span><span class="o">.</span><span class="py">f1</span><span class="o">,</span> <span class="n">s1</span> <span class="k">=&gt;</span> <span class="nf">print2</span><span class="o">(</span><span class="n">s1</span><span class="o">))</span>

      <span class="n">print1</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>And lo and behold! We have implemented our very own typed printing function.</p>

<h1 id="using-the-function">Using the function</h1>

<p>How can we use our function? Well that’s easy, like this:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">println</span><span class="o">(</span>
  <span class="n">implicitly</span><span class="o">[</span><span class="kt">TPrinter.Aux</span><span class="o">[</span>
    <span class="kt">Cmp</span><span class="o">[</span><span class="kt">Cmp</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">Val</span><span class="o">[</span><span class="kt">String</span><span class="o">]]</span>, <span class="kt">Cmp</span><span class="o">[</span><span class="kt">Lit</span>, <span class="kt">Val</span><span class="o">[</span><span class="kt">Int</span><span class="o">]]]</span>, <span class="kt">String</span>, <span class="kt">String</span> <span class="k">=&gt;</span> <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">]</span>
  <span class="o">].</span><span class="py">print</span><span class="o">(</span><span class="n">nameAge</span><span class="o">,</span> <span class="n">identity</span><span class="o">)(</span><span class="s">"ruben"</span><span class="o">)(</span><span class="mi">23</span><span class="o">))</span>
</code></pre></div></div>

<p>Not convinced on the usability? Okay let’s create an <code class="language-plaintext highlighter-rouge">implicit class</code> for some nicer ops</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">implicit</span> <span class="k">class</span> <span class="nc">printerOps</span><span class="o">[</span><span class="kt">A</span> <span class="k">&lt;:</span> <span class="kt">F</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span> <span class="o">{</span>
   <span class="k">def</span> <span class="nf">print</span><span class="o">[</span><span class="kt">X</span>, <span class="kt">O</span><span class="o">](</span><span class="n">k</span><span class="k">:</span> <span class="kt">String</span> <span class="o">=&gt;</span> <span class="n">X</span><span class="o">)(</span><span class="k">implicit</span> <span class="n">tp</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">X</span>, <span class="kt">O</span><span class="o">])</span><span class="k">:</span> <span class="kt">O</span> <span class="o">=</span> <span class="nv">tp</span><span class="o">.</span><span class="py">print</span><span class="o">(</span><span class="n">f</span><span class="o">,</span> <span class="n">k</span><span class="o">)</span>
   <span class="k">def</span> <span class="nf">sprintf</span><span class="o">[</span><span class="kt">O</span><span class="o">](</span><span class="k">implicit</span> <span class="n">tp</span><span class="k">:</span> <span class="kt">TPrinter.Aux</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">String</span>, <span class="kt">O</span><span class="o">])</span><span class="k">:</span> <span class="kt">O</span> <span class="o">=</span> <span class="nv">tp</span><span class="o">.</span><span class="py">print</span><span class="o">(</span><span class="n">f</span><span class="o">,</span> <span class="n">identity</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Now we can do this (I have to use <code class="language-plaintext highlighter-rouge">.apply</code> since otherwise it thinks I’m passing the implicit <code class="language-plaintext highlighter-rouge">TPrinter</code> instance):</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">println</span><span class="o">(</span><span class="nv">nameAge</span><span class="o">.</span><span class="py">sprintf</span><span class="o">[</span><span class="kt">String</span> <span class="k">=&gt;</span> <span class="kt">Int</span> <span class="k">=&gt;</span> <span class="kt">String</span><span class="o">].</span><span class="py">apply</span><span class="o">(</span><span class="s">"ruben"</span><span class="o">)(</span><span class="mi">23</span><span class="o">))</span>
</code></pre></div></div>

<p>Okay that’s a bit cooler, but if we leave out the type annotation then it doesn’t compile anymore, which is a bit of a shame.</p>

<p>But! The guys at <a href="https://github.com/lampepfl/dotty">dotty</a> have done their job well and using the dotty compiler we can write the example like this:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">println</span><span class="o">(</span><span class="nv">nameAge</span><span class="o">.</span><span class="py">sprintf</span><span class="o">.</span><span class="py">apply</span><span class="o">(</span><span class="s">"ruben"</span><span class="o">)(</span><span class="mi">23</span><span class="o">))</span>
</code></pre></div></div>

<p>Ok that’s looking more like it. Now if only we could also parse <code class="language-plaintext highlighter-rouge">"name=%s, age=%d"</code> as it’s corresponding <code class="language-plaintext highlighter-rouge">F</code> type (at compile-time), then we would have something pretty close to the original C function, but type-safe. This is probably possible by implementing type-level <code class="language-plaintext highlighter-rouge">String</code> parsing, but I’ll leave that for another time…</p>

<p>Check out the full code for this post on this <a href="https://scalafiddle.io/sf/KEbRBWp/0">scalafiddle</a>.</p>]]></content><author><name>rubenpieters</name></author><category term="TypeFamilies" /><category term="AbstractTypes" /><summary type="html"><![CDATA[Lately I have been playing around a bit with porting some code samples from Fun with Type Functions to Scala. I will be referring to the pdf typefun.pdf linked there as ‘the pdf’.]]></summary></entry><entry><title type="html">From Monad Transformers to the Eff Monad</title><link href="rubenpieters.github.io/monadtransformer/cats/eff/2017/01/27/monadtransformer-vs-effmonad-1.html" rel="alternate" type="text/html" title="From Monad Transformers to the Eff Monad" /><published>2017-01-27T00:00:00+00:00</published><updated>2017-01-27T00:00:00+00:00</updated><id>rubenpieters.github.io/monadtransformer/cats/eff/2017/01/27/monadtransformer-vs-effmonad-1</id><content type="html" xml:base="rubenpieters.github.io/monadtransformer/cats/eff/2017/01/27/monadtransformer-vs-effmonad-1.html"><![CDATA[<p>Motivated by the post of <a href="https://www.reddit.com/r/scala/comments/5pn36a/becoming_more_functional/dcsy6ud/">/u/saosebastiao</a> I will be covering an example of how to use Eff as a replacement for monad transformers, I will be using <a href="https://github.com/typelevel/cats">Cats</a> for our monad transformers, and <a href="https://github.com/atnos-org/eff">Eff</a> for the Eff monad.</p>

<p>I will use the following as our running example for the different approaches:</p>

<p>We will create a method that gets the state of an Int variable. If it is larger than 0 we will decrease it by 1, otherwise we will throw an error.</p>

<p>We can identify that we have two types of effects: a State-effect (accessing and mutating a mutable variable) and an Error-effect (exiting computation with an error).</p>

<h1 id="monad-transformers">Monad Transformers</h1>

<p>Let’s first take a look at the monad transformer approach. In this approach we work with the actual monad transformers to define our method. Let’s try that:</p>

<p>(Note that the <code class="language-plaintext highlighter-rouge">?</code> alternate syntax for type lambdas comes from <a href="https://github.com/non/kind-projector">Kind Projector</a>)</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="kt">MonadStackStateTEither</span><span class="o">[</span><span class="kt">ErrorType</span>, <span class="kt">StateType</span>, <span class="kt">ReturnType</span><span class="o">]</span> <span class="k">=</span>
  <span class="nc">StateT</span><span class="o">[</span><span class="kt">Either</span><span class="o">[</span><span class="kt">ErrorType</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">StateType</span>, <span class="kt">ReturnType</span><span class="o">]</span>

<span class="k">def</span> <span class="nf">decrMonadStackStateTEither</span><span class="k">:</span> <span class="kt">MonadStackStateTEither</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Int</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="o">???</span>
</code></pre></div></div>

<p>We can see that we compose the <code class="language-plaintext highlighter-rouge">Either</code> monad (which is what we’ll be using as our Error-effect during this post) with the <code class="language-plaintext highlighter-rouge">State</code> monad by using the <code class="language-plaintext highlighter-rouge">StateT</code> monad transformer.</p>

<p>This gives us a monad which can do both Error-effects and State-effects, which I called <code class="language-plaintext highlighter-rouge">MonadStackStateTEither</code>. Let’s complete our method definition:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">decrMonadStackStateTEither</span><span class="k">:</span> <span class="kt">MonadStackStateTEither</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Int</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
  <span class="n">x</span> <span class="k">&lt;-</span> <span class="nv">StateT</span><span class="o">.</span><span class="py">get</span><span class="o">[</span><span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">Int</span><span class="o">]</span>
  <span class="k">_</span> <span class="k">&lt;-</span> <span class="nf">if</span> <span class="o">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="nv">StateT</span><span class="o">.</span><span class="py">set</span><span class="o">[</span><span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">Int</span><span class="o">](</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="o">)</span> <span class="o">}</span>
  <span class="k">else</span> <span class="o">{</span> <span class="nv">StateT</span><span class="o">.</span><span class="py">lift</span><span class="o">[</span><span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">Int</span>, <span class="kt">Unit</span><span class="o">](</span><span class="nc">Left</span><span class="o">(</span><span class="s">"error"</span><span class="o">))</span> <span class="o">}</span>
<span class="o">}</span> <span class="nf">yield</span> <span class="o">()</span>
</code></pre></div></div>

<p>We can call the get and set methods on the <code class="language-plaintext highlighter-rouge">StateT</code> object to get correctly typed State-effects. If we want to use an Error-effect though, we have to use <code class="language-plaintext highlighter-rouge">StateT.lift</code> to lift an effect from the Error-effect to our composed stack of State and Error-effects. The lifting makes the types match up so that the Error-effect correctly matches the <code class="language-plaintext highlighter-rouge">MonadStackStateTEither</code> type.</p>

<p>You might have noticed that we arbitrarily chose to use <code class="language-plaintext highlighter-rouge">StateT</code> on top of <code class="language-plaintext highlighter-rouge">Either</code> instead of the other way around. It might look like a small detail, but it is in fact something that can completely change the computed value. So the order in which the monad transformers are set up is important.</p>

<p>We can try the other way around as well. We will use the <code class="language-plaintext highlighter-rouge">EitherT</code> monad transformer on the <code class="language-plaintext highlighter-rouge">State</code> monad to receive a monad which can do Error and State-effects.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="kt">MonadStackEitherTState</span><span class="o">[</span><span class="kt">ErrorType</span>, <span class="kt">StateType</span>, <span class="kt">ReturnType</span><span class="o">]</span> <span class="k">=</span>
  <span class="nc">EitherT</span><span class="o">[</span><span class="kt">State</span><span class="o">[</span><span class="kt">StateType</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">ErrorType</span>, <span class="kt">ReturnType</span><span class="o">]</span>

<span class="k">def</span> <span class="nf">decrMonadStackEitherTState</span><span class="k">:</span> <span class="kt">MonadStackEitherTState</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Int</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
  <span class="n">x</span> <span class="k">&lt;-</span> <span class="nv">EitherT</span><span class="o">.</span><span class="py">liftT</span><span class="o">[</span><span class="kt">State</span><span class="o">[</span><span class="kt">Int</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">String</span>, <span class="kt">Int</span><span class="o">](</span><span class="nv">State</span><span class="o">.</span><span class="py">get</span><span class="o">[</span><span class="kt">Int</span><span class="o">])</span>
  <span class="k">_</span> <span class="k">&lt;-</span> <span class="nf">if</span> <span class="o">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="nv">EitherT</span><span class="o">.</span><span class="py">liftT</span><span class="o">[</span><span class="kt">State</span><span class="o">[</span><span class="kt">Int</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">String</span>, <span class="kt">Unit</span><span class="o">](</span><span class="nv">State</span><span class="o">.</span><span class="py">set</span><span class="o">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="o">))</span> <span class="o">}</span>
  <span class="k">else</span> <span class="o">{</span> <span class="nv">EitherT</span><span class="o">.</span><span class="py">left</span><span class="o">[</span><span class="kt">State</span><span class="o">[</span><span class="kt">Int</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">String</span>, <span class="kt">Unit</span><span class="o">](</span><span class="nv">State</span><span class="o">.</span><span class="py">pure</span><span class="o">(</span><span class="s">"error"</span><span class="o">))</span> <span class="o">}</span>
<span class="o">}</span> <span class="nf">yield</span> <span class="o">()</span>
</code></pre></div></div>

<p>We see that now we have to lift State-effects into the correct type via the <code class="language-plaintext highlighter-rouge">EitherT.liftT</code> method.</p>

<p>If we run our method we can see that the results we get have different types, which is part of the reason why the order of the monad transformers matter.</p>

<p>(Note that in our second example we need the first <code class="language-plaintext highlighter-rouge">.value</code> to access the <code class="language-plaintext highlighter-rouge">.run</code> method from <code class="language-plaintext highlighter-rouge">State</code> and the second <code class="language-plaintext highlighter-rouge">.value</code> because <code class="language-plaintext highlighter-rouge">State[S, A]</code> is an alias for <code class="language-plaintext highlighter-rouge">StateT[Eval, S, A]</code>, which means that we have an <code class="language-plaintext highlighter-rouge">Eval</code> effect as well)</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">resultStateTEither</span><span class="k">:</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="o">(</span><span class="kt">Int</span>, <span class="kt">Unit</span><span class="o">)]</span> <span class="k">=</span>
  <span class="nv">decrMonadStackStateTEither</span><span class="o">.</span><span class="py">run</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span>
<span class="c1">// returns: Left(error)</span>
<span class="k">val</span> <span class="nv">resultEitherTState</span><span class="k">:</span> <span class="o">(</span><span class="kt">Int</span><span class="o">,</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Unit</span><span class="o">])</span> <span class="k">=</span>
  <span class="nv">decrMonadStackEitherTState</span><span class="o">.</span><span class="py">value</span><span class="o">.</span><span class="py">run</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="py">value</span>
<span class="c1">// returns: (0,Left(error))</span>
</code></pre></div></div>

<h1 id="mtl-style-monad-transformers"><a href="https://hackage.haskell.org/package/mtl">mtl</a>-Style Monad Transformers</h1>

<p>In this style we have typeclasses for our effects. In our case we will be using <code class="language-plaintext highlighter-rouge">MonadState</code> and <code class="language-plaintext highlighter-rouge">MonadError</code>. These typeclasses define methods which make sense for their corresponding effects. So <code class="language-plaintext highlighter-rouge">MonadState</code> defines methods to interact with a State-effect (get, put, modify, …) and <code class="language-plaintext highlighter-rouge">MonadError</code> defines methods to interact with an Error-effect (raise, catch, …).</p>

<p>We declare the result type of our method to be a generic <code class="language-plaintext highlighter-rouge">F[_]</code>. Then we implicitly take a <code class="language-plaintext highlighter-rouge">MonadState[F]</code> and <code class="language-plaintext highlighter-rouge">MonadError[F]</code>. This means that this method is generic for any <code class="language-plaintext highlighter-rouge">F[_]</code> which can interact as both of those effects. In this way we do not have to lift any effects into our result type, this lifting will be done in the typeclass instances if necessary.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// beware: does NOT compile, see below</span>
<span class="k">def</span> <span class="nf">decrMtlStateError</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]](</span><span class="k">implicit</span>
  <span class="n">ms</span><span class="k">:</span> <span class="kt">MonadState</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">Int</span><span class="o">],</span>
  <span class="n">me</span><span class="k">:</span> <span class="kt">MonadError</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">String</span><span class="o">])</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
    <span class="n">x</span> <span class="k">&lt;-</span> <span class="nv">ms</span><span class="o">.</span><span class="py">get</span>
    <span class="k">_</span> <span class="k">&lt;-</span> <span class="nf">if</span> <span class="o">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="nv">ms</span><span class="o">.</span><span class="py">set</span><span class="o">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="o">)</span> <span class="o">}</span>
    <span class="k">else</span> <span class="o">{</span> <span class="nv">me</span><span class="o">.</span><span class="py">raiseError</span><span class="o">(</span><span class="s">"error"</span><span class="o">)</span> <span class="o">}</span>
  <span class="o">}</span> <span class="nf">yield</span> <span class="o">()</span>
</code></pre></div></div>

<p>This method unfortunately does not compile (on Scala 2.12.1 and Cats 0.9.0). The reason for that is that <code class="language-plaintext highlighter-rouge">MonadState</code> and <code class="language-plaintext highlighter-rouge">MonadError</code> both are <code class="language-plaintext highlighter-rouge">Monad[F]</code> instances and so there is an ambiguous implicit. We can resolve this by explicitly using the <code class="language-plaintext highlighter-rouge">flatMap</code> method on one of both.</p>

<p>We can write it like this to get it compiled, but it looks a bit ugly:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">decrMtlStateError</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]](</span><span class="k">implicit</span>
  <span class="n">ms</span><span class="k">:</span> <span class="kt">MonadState</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">Int</span><span class="o">],</span>
  <span class="n">me</span><span class="k">:</span> <span class="kt">MonadError</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">String</span><span class="o">])</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="o">{</span>
  <span class="nv">ms</span><span class="o">.</span><span class="py">flatMap</span><span class="o">(</span><span class="nv">ms</span><span class="o">.</span><span class="py">get</span><span class="o">)</span> <span class="o">{</span> <span class="n">x</span> <span class="k">=&gt;</span>
    <span class="nf">if</span> <span class="o">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="nv">ms</span><span class="o">.</span><span class="py">set</span><span class="o">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="o">)</span> <span class="o">}</span>
    <span class="k">else</span> <span class="o">{</span> <span class="nv">me</span><span class="o">.</span><span class="py">raiseError</span><span class="o">(</span><span class="s">"error"</span><span class="o">)</span> <span class="o">}</span>
  <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Then we can reuse this method for both monad types we used earlier in our example… If there would be a <code class="language-plaintext highlighter-rouge">MonadState</code> instance defined for <code class="language-plaintext highlighter-rouge">EitherT</code>, which as of writing this post is not the case (on Cats 0.9.0). But we can define our own for now (*).</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">resultMtlStateTEither</span><span class="k">:</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="o">(</span><span class="kt">Int</span>, <span class="kt">Unit</span><span class="o">)]</span> <span class="k">=</span>
  <span class="n">decrMtlStateError</span><span class="o">[</span><span class="kt">StateT</span><span class="o">[</span><span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">Int</span>, <span class="kt">?</span><span class="o">]].</span><span class="py">run</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span>
<span class="c1">// returns: Left(error)</span>
<span class="k">val</span> <span class="nv">resultMtlEitherTState</span><span class="k">:</span> <span class="o">(</span><span class="kt">Int</span><span class="o">,</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Unit</span><span class="o">])</span> <span class="k">=</span>
  <span class="n">decrMtlStateError</span><span class="o">[</span><span class="kt">EitherT</span><span class="o">[</span><span class="kt">State</span><span class="o">[</span><span class="kt">Int</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">String</span>, <span class="kt">?</span><span class="o">]].</span><span class="py">value</span><span class="o">.</span><span class="py">run</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="py">value</span>
<span class="c1">// returns: (0,Left(error))</span>
</code></pre></div></div>

<p>We see we get the same results as in the previous paragraph, but we could reuse our generic method.</p>

<p>I’m not sure if this style is common in Scala, since playing with this simple example I already came across some issues. But I thought it would be interesting to include it, since it might provide some additional insight moving from monad transformers to Eff.</p>

<h1 id="eff">Eff</h1>

<p>The way we use effects in Eff is somewhat similar to the mtl-style. We also have to declare as implicit parameters which effects we want to use. Let’s define some aliases for our effects (like in the Eff user guide):</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="k">_</span><span class="kt">eitherString</span><span class="o">[</span><span class="kt">R</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">?</span><span class="o">]</span> <span class="o">|=</span> <span class="n">R</span>
<span class="k">type</span> <span class="k">_</span><span class="kt">stateInt</span><span class="o">[</span><span class="kt">R</span><span class="o">]</span> <span class="k">=</span> <span class="nc">State</span><span class="o">[</span><span class="kt">Int</span>, <span class="kt">?</span><span class="o">]</span> <span class="o">|=</span> <span class="n">R</span>
</code></pre></div></div>

<p>In Eff the type variable <code class="language-plaintext highlighter-rouge">R</code> signifies the effect stack. This stack will contain all the effects which our methods can utilize. The <code class="language-plaintext highlighter-rouge">|=</code> helper functions means that the effect on the left is a member of the stack <code class="language-plaintext highlighter-rouge">R</code>. We will use this as an implicit parameter in the same way as we took <code class="language-plaintext highlighter-rouge">MonadState</code> and <code class="language-plaintext highlighter-rouge">MonadError</code> as implicit parameters.</p>

<p>Our method signature looks like this:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">decrEff</span><span class="o">[</span><span class="kt">R</span> <span class="kt">:</span> <span class="k">_</span><span class="kt">eitherString</span> <span class="kt">:</span> <span class="k">_</span><span class="kt">stateInt</span><span class="o">]</span><span class="k">:</span> <span class="kt">Eff</span><span class="o">[</span><span class="kt">R</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="o">???</span>
</code></pre></div></div>

<p>Our effect stack <code class="language-plaintext highlighter-rouge">R</code> is a generic type and it must contain at least our <code class="language-plaintext highlighter-rouge">_eitherString</code> and <code class="language-plaintext highlighter-rouge">_stateInt</code> effect . Our result is <code class="language-plaintext highlighter-rouge">Eff[R, A]</code>, which means that we will get a result of type <code class="language-plaintext highlighter-rouge">A</code>, but we might also execute effects according to the effects in the stack <code class="language-plaintext highlighter-rouge">R</code>. For our method <code class="language-plaintext highlighter-rouge">A</code> is <code class="language-plaintext highlighter-rouge">Unit</code>.</p>

<p>By importing the Eff syntax (import org.atnos.eff._, org.atnos.eff.all._, org.atnos.eff.syntax.all._) we can get a method which looks very similar to our mtl-style method:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">decrEff</span><span class="o">[</span><span class="kt">R</span> <span class="kt">:</span> <span class="k">_</span><span class="kt">eitherString</span> <span class="kt">:</span> <span class="k">_</span><span class="kt">stateInt</span><span class="o">]</span><span class="k">:</span> <span class="kt">Eff</span><span class="o">[</span><span class="kt">R</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
  <span class="n">x</span> <span class="k">&lt;-</span> <span class="n">get</span>
  <span class="k">_</span> <span class="k">&lt;-</span> <span class="nf">if</span> <span class="o">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="nf">put</span><span class="o">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="o">)</span> <span class="o">}</span>
  <span class="k">else</span> <span class="o">{</span> <span class="nf">left</span><span class="o">(</span><span class="s">"error"</span><span class="o">)</span> <span class="o">}</span>
<span class="o">}</span> <span class="nf">yield</span> <span class="o">()</span>
</code></pre></div></div>

<p>Now when calling our method we have to do two things: 1. Choose which effect types we want to use to handle the effects in our stack 2. Choose in which order we will run our effects.</p>

<p>Choosing the types can be done like this:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="kt">FxStack</span> <span class="o">=</span> <span class="nv">Fx</span><span class="o">.</span><span class="py">fx2</span><span class="o">[</span><span class="kt">State</span><span class="o">[</span><span class="kt">Int</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">?</span><span class="o">]]</span>
</code></pre></div></div>

<p>And we can choose the order of effects by composing the <code class="language-plaintext highlighter-rouge">runEither</code> and <code class="language-plaintext highlighter-rouge">runState</code> methods differently.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">val</span> <span class="nv">resultRunStateRunEither</span><span class="k">:</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="o">(</span><span class="kt">Unit</span>, <span class="kt">Int</span><span class="o">)]</span> <span class="k">=</span>
  <span class="n">decrEff</span><span class="o">[</span><span class="kt">FxStack</span><span class="o">].</span><span class="py">runState</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="py">runEither</span><span class="o">.</span><span class="py">run</span>
  <span class="c1">// returns: Left(error)</span>
<span class="k">val</span> <span class="nv">resultRunEitherRunState</span><span class="k">:</span> <span class="o">(</span><span class="kt">Either</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Unit</span><span class="o">],</span> <span class="nc">Int</span><span class="o">)</span> <span class="k">=</span>
  <span class="n">decrEff</span><span class="o">[</span><span class="kt">FxStack</span><span class="o">].</span><span class="py">runEither</span><span class="o">.</span><span class="py">runState</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="py">run</span>
  <span class="c1">// returns: (Left(error),0)</span>
</code></pre></div></div>

<p>So hopefully by going through this example the basics of Eff are explained well enough to go through the <a href="http://atnos-org.github.io/eff/">user guide</a> and learn more about it.</p>

<p>You can find all the code used in this post on this <a href="https://gist.github.com/rubenpieters/d154975fac5d0ca36c3082e7d4bf2878">gist</a>.</p>

<h4 id="remark-1-">Remark 1 (*)</h4>

<p>The <code class="language-plaintext highlighter-rouge">MonadState</code> instance for <code class="language-plaintext highlighter-rouge">EitherT</code> I used is:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">implicit</span> <span class="k">def</span> <span class="nf">monadStateEitherT</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]</span>, <span class="kt">E</span>, <span class="kt">S</span><span class="o">](</span><span class="k">implicit</span> <span class="n">ms</span><span class="k">:</span> <span class="kt">MonadState</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">S</span><span class="o">])</span>
    <span class="k">:</span> <span class="kt">MonadState</span><span class="o">[</span><span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">S</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">MonadState</span><span class="o">[</span><span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">?</span><span class="o">]</span>, <span class="kt">S</span><span class="o">]</span> <span class="o">{</span>
    <span class="k">val</span> <span class="nv">F</span> <span class="k">=</span> <span class="nc">Monad</span><span class="o">[</span><span class="kt">F</span><span class="o">]</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">get</span><span class="k">:</span> <span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">S</span><span class="o">]</span> <span class="k">=</span> <span class="nv">EitherT</span><span class="o">.</span><span class="py">liftT</span><span class="o">(</span><span class="nv">ms</span><span class="o">.</span><span class="py">get</span><span class="o">)</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">set</span><span class="o">(</span><span class="n">s</span><span class="k">:</span> <span class="kt">S</span><span class="o">)</span><span class="k">:</span> <span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">Unit</span><span class="o">]</span> <span class="k">=</span> <span class="nv">EitherT</span><span class="o">.</span><span class="py">liftT</span><span class="o">(</span><span class="nv">ms</span><span class="o">.</span><span class="py">set</span><span class="o">(</span><span class="n">s</span><span class="o">))</span>
    <span class="c1">// copied from cats EitherTMonad</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">pure</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">EitherT</span><span class="o">(</span><span class="nv">F</span><span class="o">.</span><span class="py">pure</span><span class="o">(</span><span class="nv">Either</span><span class="o">.</span><span class="py">right</span><span class="o">(</span><span class="n">a</span><span class="o">)))</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">flatMap</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">](</span><span class="n">fa</span><span class="k">:</span> <span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">A</span><span class="o">])(</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="nc">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">B</span><span class="o">])</span><span class="k">:</span> <span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">B</span><span class="o">]</span> <span class="k">=</span> <span class="n">fa</span> <span class="n">flatMap</span> <span class="n">f</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">tailRecM</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)(</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="nc">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">Either</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">]])</span><span class="k">:</span> <span class="kt">EitherT</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">E</span>, <span class="kt">B</span><span class="o">]</span> <span class="k">=</span>
      <span class="nc">EitherT</span><span class="o">(</span><span class="nv">F</span><span class="o">.</span><span class="py">tailRecM</span><span class="o">(</span><span class="n">a</span><span class="o">)(</span><span class="n">a0</span> <span class="k">=&gt;</span> <span class="nv">F</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="nf">f</span><span class="o">(</span><span class="n">a0</span><span class="o">).</span><span class="py">value</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">case</span> <span class="nc">Left</span><span class="o">(</span><span class="n">l</span><span class="o">)</span>         <span class="k">=&gt;</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Left</span><span class="o">(</span><span class="n">l</span><span class="o">))</span>
        <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Left</span><span class="o">(</span><span class="n">a1</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nc">Left</span><span class="o">(</span><span class="n">a1</span><span class="o">)</span>
        <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Right</span><span class="o">(</span><span class="n">b</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Right</span><span class="o">(</span><span class="n">b</span><span class="o">))</span>
      <span class="o">}))</span>
  <span class="o">}</span>
</code></pre></div></div>]]></content><author><name>rubenpieters</name></author><category term="MonadTransformer" /><category term="Cats" /><category term="Eff" /><summary type="html"><![CDATA[Motivated by the post of /u/saosebastiao I will be covering an example of how to use Eff as a replacement for monad transformers, I will be using Cats for our monad transformers, and Eff for the Eff monad.]]></summary></entry><entry><title type="html">Wrapping Java-style methods with ApplicativeError and Cats</title><link href="rubenpieters.github.io/applicativeerror/cats/2017/01/20/applicativeerror-1.html" rel="alternate" type="text/html" title="Wrapping Java-style methods with ApplicativeError and Cats" /><published>2017-01-20T00:00:00+00:00</published><updated>2017-01-20T00:00:00+00:00</updated><id>rubenpieters.github.io/applicativeerror/cats/2017/01/20/applicativeerror-1</id><content type="html" xml:base="rubenpieters.github.io/applicativeerror/cats/2017/01/20/applicativeerror-1.html"><![CDATA[<p>Let’s take a look on some ways to convert Java-style methods (returning nulls and throwing exceptions) as pure Scala values.</p>

<p>At the end of the post I hope to define a function which you might find nicer to work with than some of the more obvious options. I will do this by using the ApplicativeError abstraction from Cats.</p>

<p>Imagine this contrived method def, the main point being certain inputs can return nulls and others might throw exceptions:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">unsafeVal</span><span class="o">(</span><span class="n">x</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">=</span> <span class="n">x</span> <span class="k">match</span> <span class="o">{</span>
  <span class="k">case</span> <span class="s">"a"</span> <span class="k">=&gt;</span> <span class="s">"a"</span>
  <span class="k">case</span> <span class="s">"b"</span> <span class="k">=&gt;</span> <span class="kc">null</span>
  <span class="k">case</span> <span class="s">"c"</span> <span class="k">=&gt;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">IllegalArgumentException</span>
<span class="o">}</span>
</code></pre></div></div>

<p>As our first idea to handle it as a pure value we might come up with the following:</p>

<p>(in the meantime lets quickly <a href="https://github.com/typelevel/cats">import cats._, cats.data._, cats.implicits._</a> )</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">safeWrap</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">Throwable</span>, <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]]</span> <span class="k">=</span>
  <span class="nv">Either</span><span class="o">.</span><span class="py">catchNonFatal</span><span class="o">(</span><span class="nc">Option</span><span class="o">(</span><span class="n">f</span><span class="o">))</span>
</code></pre></div></div>

<p>Great, we are using the <code class="language-plaintext highlighter-rouge">Either</code> and <code class="language-plaintext highlighter-rouge">Option</code> types, which means we are done right?</p>

<p>Technically yes, but let’s not rush things. The function we have created will safely capture the nulls and exceptions, but do we always want to handle an <code class="language-plaintext highlighter-rouge">Either[Throwable, Option[A]]</code> type?</p>

<p>What happens if we do not want a <code class="language-plaintext highlighter-rouge">None</code> but we want a <code class="language-plaintext highlighter-rouge">Left(new NullPointerException)</code>, or we do not want to involve <code class="language-plaintext highlighter-rouge">Either</code>s and we only want <code class="language-plaintext highlighter-rouge">None</code> if something (no matter what) went wrong, or maybe we want to use something completely different than <code class="language-plaintext highlighter-rouge">Either</code>/<code class="language-plaintext highlighter-rouge">Option</code> as our datatype encoding Success/Failure?</p>

<p>No problem! You might say, we can easily pattern match on our <code class="language-plaintext highlighter-rouge">Either[Throwable, Option[A]]</code> type and convert it to whatever we want!</p>

<p>A helper method for <code class="language-plaintext highlighter-rouge">Option[A]</code>:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">safeWrapOption</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">nullVal</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">None</span><span class="o">)</span>
  <span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nf">safeWrap</span><span class="o">(</span><span class="n">f</span><span class="o">)</span> <span class="k">match</span> <span class="o">{</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">None</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">nullVal</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">case</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nc">None</span>
<span class="o">}</span>
</code></pre></div></div>

<p>A helper method for <code class="language-plaintext highlighter-rouge">Either[Throwable, A]</code>:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">safeWrapEither</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">nullVal</span><span class="k">:</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">Throwable</span>, <span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Left</span><span class="o">(</span><span class="k">new</span> <span class="nc">NullPointerException</span><span class="o">))</span>
  <span class="k">:</span> <span class="kt">Either</span><span class="o">[</span><span class="kt">Throwable</span>, <span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nf">safeWrap</span><span class="o">(</span><span class="n">f</span><span class="o">)</span> <span class="k">match</span> <span class="o">{</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">None</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">nullVal</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nc">Right</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">case</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>A helper method for <code class="language-plaintext highlighter-rouge">Future[A]</code>:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nn">scala.concurrent.Future</span>

<span class="k">def</span> <span class="nf">safeWrapFuture</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">nullVal</span><span class="k">:</span> <span class="kt">Future</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nv">Future</span><span class="o">.</span><span class="py">failed</span><span class="o">(</span><span class="k">new</span> <span class="nc">NullPointerException</span><span class="o">))</span>
  <span class="k">:</span> <span class="kt">Future</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nf">safeWrap</span><span class="o">(</span><span class="n">f</span><span class="o">)</span> <span class="k">match</span> <span class="o">{</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">None</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">nullVal</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nv">Future</span><span class="o">.</span><span class="py">successful</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">case</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nv">Future</span><span class="o">.</span><span class="py">failed</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>etc…</p>

<p>These helpers are definitely useful, but it looks very <a href="https://en.wikipedia.org/wiki/Don't_repeat_yourself">WET</a>.</p>

<p>It seems we need some kind of typeclass which can give us what a Success and a Failure value is, potentially with the possibility to store the specific error as a <code class="language-plaintext highlighter-rouge">Throwable</code>.</p>

<p>Let’s define our trait and some instances:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">trait</span> <span class="nc">GenericSuccessFailure</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]]</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">createSuccess</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span>
  <span class="k">def</span> <span class="nf">createFailure</span><span class="o">(</span><span class="n">e</span><span class="k">:</span> <span class="kt">Throwable</span><span class="o">)</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span>
<span class="o">}</span>

<span class="k">implicit</span> <span class="k">val</span> <span class="nv">gsfOption</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">GenericSuccessFailure</span><span class="o">[</span><span class="kt">Option</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">createSuccess</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">def</span> <span class="nf">createFailure</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">e</span><span class="k">:</span> <span class="kt">Throwable</span><span class="o">)</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">None</span>
<span class="o">}</span>

<span class="k">type</span> <span class="kt">EitherThrow</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Either</span><span class="o">[</span><span class="kt">Throwable</span>, <span class="kt">A</span><span class="o">]</span>
<span class="k">implicit</span> <span class="k">val</span> <span class="nv">gsfEither</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">GenericSuccessFailure</span><span class="o">[</span><span class="kt">EitherThrow</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">createSuccess</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">EitherThrow</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Right</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">def</span> <span class="nf">createFailure</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">e</span><span class="k">:</span> <span class="kt">Throwable</span><span class="o">)</span><span class="k">:</span> <span class="kt">EitherThrow</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
<span class="o">}</span>

<span class="k">implicit</span> <span class="k">val</span> <span class="nv">gsfFuture</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">GenericSuccessFailure</span><span class="o">[</span><span class="kt">Future</span><span class="o">]</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">createSuccess</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">Future</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nv">Future</span><span class="o">.</span><span class="py">successful</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">def</span> <span class="nf">createFailure</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">e</span><span class="k">:</span> <span class="kt">Throwable</span><span class="o">)</span><span class="k">:</span> <span class="kt">Future</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nv">Future</span><span class="o">.</span><span class="py">failed</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Now we can write our safeWrap method in terms of this typeclass:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">safeWrapGeneric</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]</span>, <span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">nullVal</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="k">implicit</span>
  <span class="n">gsf</span><span class="k">:</span> <span class="kt">GenericSuccessFailure</span><span class="o">[</span><span class="kt">F</span><span class="o">])</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nf">safeWrap</span><span class="o">(</span><span class="n">f</span><span class="o">)</span> <span class="k">match</span> <span class="o">{</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">None</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">nullVal</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nv">gsf</span><span class="o">.</span><span class="py">createSuccess</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">case</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nv">gsf</span><span class="o">.</span><span class="py">createFailure</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>That looks pretty good. But if we had searched around a bit we might have found that our typeclass already exists! D’oh.</p>

<p>It’s called <a href="https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/ApplicativeError.scala">ApplicativeError</a>, we can consider <code class="language-plaintext highlighter-rouge">pure</code> as our <code class="language-plaintext highlighter-rouge">createSuccess</code> and <code class="language-plaintext highlighter-rouge">raiseError</code> as our <code class="language-plaintext highlighter-rouge">createFailure</code>.</p>

<p>Let’s rewrite our generic method:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">safeWrapApplicativeError</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]</span>, <span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">nullVal</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="k">implicit</span>
  <span class="n">ae</span><span class="k">:</span> <span class="kt">ApplicativeError</span><span class="o">[</span><span class="kt">F</span><span class="o">])</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="nf">safeWrap</span><span class="o">(</span><span class="n">f</span><span class="o">)</span> <span class="k">match</span> <span class="o">{</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">None</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">nullVal</span>
  <span class="k">case</span> <span class="nc">Right</span><span class="o">(</span><span class="nc">Some</span><span class="o">(</span><span class="n">a</span><span class="o">))</span> <span class="k">=&gt;</span> <span class="nv">ae</span><span class="o">.</span><span class="py">pure</span><span class="o">(</span><span class="n">a</span><span class="o">)</span>
  <span class="k">case</span> <span class="nc">Left</span><span class="o">(</span><span class="n">e</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nv">ae</span><span class="o">.</span><span class="py">raiseError</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>

<p>That looks just as good, but with the added benefit that we don’t have to define the instances for our typeclass ourselves when they are provided by Cats (*).</p>

<p>If we would so desire, we could easily refactor the generic method to handle <code class="language-plaintext highlighter-rouge">null</code> values and exceptions immediately (instead of using an intermadiate <code class="language-plaintext highlighter-rouge">Either</code> and <code class="language-plaintext highlighter-rouge">Option</code>). An immediate advantage for adhering to the DRY principle.</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">safeWrapApplicativeErrorAlt</span><span class="o">[</span><span class="kt">F</span><span class="o">[</span><span class="k">_</span><span class="o">]</span>, <span class="kt">A</span><span class="o">](</span><span class="n">f</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">nullVal</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="k">implicit</span>
  <span class="n">ae</span><span class="k">:</span> <span class="kt">ApplicativeError</span><span class="o">[</span><span class="kt">F</span>, <span class="kt">Throwable</span><span class="o">])</span><span class="k">:</span> <span class="kt">F</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span>
  <span class="k">try</span> <span class="o">{</span>
    <span class="n">f</span> <span class="k">match</span> <span class="o">{</span>
      <span class="k">case</span> <span class="kc">null</span> <span class="k">=&gt;</span> <span class="n">nullVal</span>
      <span class="k">case</span> <span class="n">notNull</span> <span class="k">=&gt;</span> <span class="nv">ae</span><span class="o">.</span><span class="py">pure</span><span class="o">(</span><span class="n">notNull</span><span class="o">)</span>
    <span class="o">}</span>
  <span class="o">}</span> <span class="k">catch</span> <span class="o">{</span>
    <span class="k">case</span> <span class="nc">NonFatal</span><span class="o">(</span><span class="n">e</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nv">ae</span><span class="o">.</span><span class="py">raiseError</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
  <span class="o">}</span>
</code></pre></div></div>

<p>So, in the post we iterated through a design to convert Java-style methods to pure values. Ultimately we ended up with a generic method using the <code class="language-plaintext highlighter-rouge">ApplicativeError</code> from Cats. If you want you can use some of the other methods available on <code class="language-plaintext highlighter-rouge">ApplicativeError</code> to define other utilities as well.</p>

<p>You can take a look at the complete code from this post on this <a href="https://scalafiddle.io/sf/xADqbDO/0">scalafiddle</a>.</p>

<p>Also note that we can use <a href="https://tpolecat.github.io/2015/07/30/infer.html">this</a> trick to have a neater type inference. You will only have to specify your error type, not your result type (I definitely recommend doing this).</p>

<h4 id="remark-1-">Remark 1 (*):</h4>

<p>There is no instance for <code class="language-plaintext highlighter-rouge">MonadError[Option, Throwable]</code>, only for <code class="language-plaintext highlighter-rouge">MonadError[Option, Unit]</code></p>

<p>We can make use of the existing cats Option instances to define an instance like this:</p>

<div class="language-scala highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">implicit</span> <span class="k">val</span> <span class="nv">optionMonadErr</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">MonadError</span><span class="o">[</span><span class="kt">Option</span>, <span class="kt">Throwable</span><span class="o">]</span> <span class="o">{</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">flatMap</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">](</span><span class="n">fa</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">A</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="nc">Option</span><span class="o">[</span><span class="kt">B</span><span class="o">])</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">B</span><span class="o">]</span> <span class="k">=</span>
      <span class="nv">catsStdInstancesForOption</span><span class="o">.</span><span class="py">flatMap</span><span class="o">(</span><span class="n">fa</span><span class="o">)(</span><span class="n">f</span><span class="o">)</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">tailRecM</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)(</span><span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">A</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="nc">Option</span><span class="o">[</span><span class="kt">Either</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">]])</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">B</span><span class="o">]</span> <span class="k">=</span>
      <span class="nv">catsStdInstancesForOption</span><span class="o">.</span><span class="py">tailRecM</span><span class="o">(</span><span class="n">a</span><span class="o">)(</span><span class="n">f</span><span class="o">)</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">handleErrorWith</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">fa</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">Throwable</span><span class="o">)</span> <span class="o">=&gt;</span> <span class="nc">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span>
      <span class="nv">catsStdInstancesForOption</span><span class="o">.</span><span class="py">handleErrorWith</span><span class="o">(</span><span class="n">fa</span><span class="o">)(</span><span class="k">_</span> <span class="k">=&gt;</span> <span class="nc">None</span><span class="o">)</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">raiseError</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">e</span><span class="k">:</span> <span class="kt">Throwable</span><span class="o">)</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span>
      <span class="nv">catsStdInstancesForOption</span><span class="o">.</span><span class="py">raiseError</span><span class="o">(())</span>
    <span class="k">override</span> <span class="k">def</span> <span class="nf">pure</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">x</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span>
      <span class="nv">catsStdInstancesForOption</span><span class="o">.</span><span class="py">pure</span><span class="o">(</span><span class="n">x</span><span class="o">)</span>
  <span class="o">}</span>
</code></pre></div></div>

<p>Do note that by using this instance you will be throwing away some information and behaviour. In <code class="language-plaintext highlighter-rouge">raiseError</code> you throw away the ability to store the occurred error and in <code class="language-plaintext highlighter-rouge">handleErrorWith</code> every error will be handled by a <code class="language-plaintext highlighter-rouge">None</code>. You could always define an instance more suited to your needs if you want, or keep the separation between <code class="language-plaintext highlighter-rouge">MonadError</code> with <code class="language-plaintext highlighter-rouge">Throwable</code>s and <code class="language-plaintext highlighter-rouge">Unit</code>s more distinct by not defining a new instance but creating different methods.</p>

<p>Also when using <code class="language-plaintext highlighter-rouge">Future</code> and Cats: don’t forget to have an <code class="language-plaintext highlighter-rouge">ExecutionContext</code> in scope otherwise the implicit resolution won’t find any instances!</p>]]></content><author><name>rubenpieters</name></author><category term="ApplicativeError" /><category term="Cats" /><summary type="html"><![CDATA[Let’s take a look on some ways to convert Java-style methods (returning nulls and throwing exceptions) as pure Scala values.]]></summary></entry></feed>