<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Angelo Sciarra</title>
    <description>The latest articles on DEV Community by Angelo Sciarra (@eureka84).</description>
    <link>https://dev.to/eureka84</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F137167%2F560ba2b3-ec3f-470f-a8d4-741e2899aa39.jpeg</url>
      <title>DEV Community: Angelo Sciarra</title>
      <link>https://dev.to/eureka84</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eureka84"/>
    <language>en</language>
    <item>
      <title>IO: to be a Monad or not to be, that's the question!</title>
      <dc:creator>Angelo Sciarra</dc:creator>
      <pubDate>Thu, 06 Aug 2020 13:55:30 +0000</pubDate>
      <link>https://dev.to/eureka84/io-to-be-a-monad-or-not-to-be-that-s-the-question-ebo</link>
      <guid>https://dev.to/eureka84/io-to-be-a-monad-or-not-to-be-that-s-the-question-ebo</guid>
      <description>&lt;p&gt;Hello folks, &lt;br&gt;
I promised you in &lt;a href="https://dev.to/eureka84/how-to-live-in-a-pure-world-5fbj"&gt;How to live in a pure world&lt;/a&gt; I would have written a full article showing an example of how to deal with IO functionally and here it is!&lt;/p&gt;

&lt;p&gt;I will use Kotlin and its functional companion library: Arrow. &lt;/p&gt;
&lt;h1&gt;
  
  
  A brief history of Arrow
&lt;/h1&gt;

&lt;p&gt;Arrow was born as a merge of two functional libraries in the Kotlin universe: &lt;strong&gt;FunKtionale&lt;/strong&gt; and &lt;strong&gt;Kategory&lt;/strong&gt;. The contributors of the two libraries decided to join forces and so &lt;strong&gt;Arrow&lt;/strong&gt; was born.&lt;/p&gt;

&lt;p&gt;Like other libraries in other programming languages (like ScalaZ and Cats in Scala), Arrow tried to provide the same concepts of typed functional programming that were born in the Haskell universe: so they started out defining some core data types (Option, Try, Either, Validated, etc.) and a bunch of &lt;a href="http://learnyouahaskell.com/types-and-typeclasses"&gt;typeclasses&lt;/a&gt; like Functor, Semigroup, Monoid, Monad, and the likes (much more to be true).&lt;/p&gt;

&lt;p&gt;The current version of Arrow is 0.11.0-SNAPSHOT. Arrow 0.11.0 should be released by September 2020, and the first major release should come out by the end of the year, even if it will not be marked as 1.0 but as 1.4, following the Kotlin compiler version (because of Arrow Meta).&lt;/p&gt;

&lt;p&gt;What the team is working on to target the first stable release is to simplify and stabilize the api. &lt;/p&gt;

&lt;p&gt;For example, they have already deprecated and they are going to remove the &lt;code&gt;Try&amp;lt;A&amp;gt;&lt;/code&gt; data type, because it favors an eager evaluation of code that can have side effects, in favor of &lt;code&gt;Either&amp;lt;E, A&amp;gt;&lt;/code&gt;. If you think about it you could say that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;Try&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Throwable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the non-eager evaluation is granted by the fact that, aside for right/left value constructors, the function &lt;code&gt;Either.catch()&lt;/code&gt; you use to wrap throwing blocks accepts only a suspended block (more on this later).&lt;/p&gt;

&lt;p&gt;The same kind of simplification occurred also for &lt;code&gt;Option&amp;lt;A&amp;gt;&lt;/code&gt;. There were some questions in the Kotlin community towards the actual need for such a data type, given the Kotlin language features nullable types. So Arrow maintainers have decided to ditch the &lt;code&gt;Option&lt;/code&gt; data type in favor of nullable types or, once again, &lt;code&gt;Either&lt;/code&gt;s, providing also easy means to go from nullable types to &lt;code&gt;Either&lt;/code&gt;s. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; 
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromNullable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// and if you like you can define  &lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Monads
&lt;/h1&gt;

&lt;p&gt;Before addressing the title question about whether or not IO should be modeled as a Monad, let's talk a bit about monads.&lt;/p&gt;

&lt;p&gt;What is a Monad?&lt;/p&gt;

&lt;p&gt;Last time I haven't spent much time on the subject because I wanted to focus more on the reason why IO operations were intrinsically impure &lt;/p&gt;

&lt;p&gt;So, without further ado, here is maybe the most concise definition you could find about what a Monad is: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;monad&lt;/strong&gt; is a &lt;strong&gt;monoid&lt;/strong&gt; in the &lt;strong&gt;category&lt;/strong&gt; of &lt;strong&gt;endofunctors&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem is this definition requires you to know what is a &lt;strong&gt;monoid&lt;/strong&gt;, a &lt;strong&gt;category&lt;/strong&gt;, and an &lt;strong&gt;endofunctor&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I'll try to provide you a short definition of all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monoid
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;monoid&lt;/strong&gt; is a &lt;strong&gt;semigroup&lt;/strong&gt; with a unit element, that respects the monoid laws. A semigroup is a set A with an internal operation, usually called &lt;code&gt;combine&lt;/code&gt;, that is &lt;strong&gt;associative&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Semigroup&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Monoid&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;:&lt;/span&gt; &lt;span class="nc"&gt;Semigroup&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The monoids laws are&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;associativity (because it's a semigroup): for all a,b,c in A it must be true that &lt;code&gt;combine(a,combine(b,c)) = combine(combine(a,b),c)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;left identity: for all a in A &lt;code&gt;combine(empty,a) = a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;right identity: for all a in A &lt;code&gt;combine(a,empty) = a&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Category
&lt;/h2&gt;

&lt;p&gt;This is a bit more abstract. A category C is a pair (O, M) where &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O is a collection of objects (we are not interested in better defining them)&lt;/li&gt;
&lt;li&gt;M is a collection of morphisms that connects an object A in O to an object B (m: A -&amp;gt; B)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For C to be a category it must obey to the category laws:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There must exist for every A in O an identity morphism 1A: A -&amp;gt; A&lt;/li&gt;
&lt;li&gt;There must exist an operation, called composition, indicated by &lt;code&gt;.&lt;/code&gt; such that for every 2 morphisms in M, f: A -&amp;gt; B and g: B -&amp;gt; C, it exists a morphism g &lt;code&gt;.&lt;/code&gt; f: A -&amp;gt; C. This operation must have 2 properties

&lt;ol&gt;
&lt;li&gt;associativity: for every 3 morphism in M, f: A -&amp;gt; B, g: B -&amp;gt; C and h: C -&amp;gt; D then it must be true that (f &lt;code&gt;.&lt;/code&gt; g) &lt;code&gt;.&lt;/code&gt; h = f &lt;code&gt;.&lt;/code&gt; (g &lt;code&gt;.&lt;/code&gt; h)&lt;/li&gt;
&lt;li&gt;identity: for every f: A -&amp;gt; B then 1A &lt;code&gt;.&lt;/code&gt; f = f &lt;code&gt;.&lt;/code&gt; 1B
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why are categories relevant for programmers? Well, because you can say that a programming language is a category where&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O is the collection of its types&lt;/li&gt;
&lt;li&gt;M are the functions&lt;/li&gt;
&lt;li&gt;The composition of morphism is the composition of functions. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Functor
&lt;/h2&gt;

&lt;p&gt;What is a functor? It's a map between categories that preserves the category structure. To be more precise, given 2 categories C and D, F is a functor if &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;for every object X in C, it maps an F(X) in D&lt;/li&gt;
&lt;li&gt;for every morphism f: A -&amp;gt; B in C it maps the morphism F(f) = F(A) -&amp;gt; F(B) in D&lt;/li&gt;
&lt;li&gt;for every X in C it maps the identity morphism in C into the identity morphism in D, i.e. F(1xC) = 1F(X)D
&lt;/li&gt;
&lt;li&gt;for every two morphism in C, f and g, F(f &lt;code&gt;.&lt;/code&gt; g) = F(f) &lt;code&gt;.&lt;/code&gt; F(g)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An endofunctor is just a functor from a category C into C itself. &lt;/p&gt;

&lt;p&gt;Given the previous parallelism drawn between a category and a programming language, you might be wondering: what is an endofunctor in a programming language? &lt;br&gt;
Well, if you think about it, it should be something that maps its types (the objects) but also its functions (the morphisms) between the basic types (from the original category) into functions between the &lt;strong&gt;mapped&lt;/strong&gt; types (in the &lt;strong&gt;new&lt;/strong&gt; category, the one where all the objects have the form &lt;code&gt;F&amp;lt;X&amp;gt;&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;So an endofunctor F in Kc (the Kotlin types category) is a pair F = (F(X), lift) where &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;F(X) is a type constructor (i.e. F(X) is a new type in Kc) &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lift is a function&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight kotlin"&gt;&lt;code&gt;    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;lift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I guess all this might seem a bit abstract, so an example might help. &lt;/p&gt;

&lt;p&gt;Ex.: &lt;code&gt;Option&amp;lt;A&amp;gt;&lt;/code&gt; is a functor. &lt;/p&gt;

&lt;p&gt;Why? Because it is a type constructor (from A to &lt;code&gt;Option&amp;lt;A&amp;gt;&lt;/code&gt;) and it exist a lift function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;lift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Putting it all together
&lt;/h2&gt;

&lt;p&gt;From all the definition above we can come back to a more operative definition of a monad: a monad is a type constructor with three functions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// pseudo code (to actually encode a generic monad one has to encode first the concept of higher kinded types)&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;):&lt;/span&gt; &lt;span class="nc"&gt;Monad&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;that obeys to the following laws &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;left identity: &lt;code&gt;flatMap(of(x), f) = f(x)&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;right identity: &lt;code&gt;flatMap(x, of) = x&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;associativity: &lt;code&gt;flatMap(flatMap(ma, f), g) = flatMap(mx) {x -&amp;gt; flatMap(f(x), g) }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: the actual encoding in Arrow of Monads is a bit different, the above pseudo-code was made just to give a general idea. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  IO monad
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;IO&lt;/code&gt; is a monad and in Arrow is undergoing the same simplification process shown above for the core data types: more specifically it's going to be deprecated and removed from the library (this time not in favor of &lt;code&gt;Either&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;The reasons in this case are different. &lt;/p&gt;

&lt;p&gt;The first one is that Kotlin has a language feature (suspended functions and coroutines) that can better express the intent of a data type like &lt;code&gt;IO&amp;lt;A&amp;gt;&lt;/code&gt;, with native support in the language. &lt;/p&gt;

&lt;p&gt;Secondly, if you ever try to write actual programs using &lt;code&gt;IO&lt;/code&gt;, you will probably end up with something like &lt;code&gt;IO&amp;lt;Either&amp;lt;E, A&amp;gt;&amp;gt;&lt;/code&gt;, that is not so ergonomic to work with. &lt;/p&gt;

&lt;p&gt;Let's see it with an example (finally, am I right?)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;emailAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EmailAddress&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;EmailAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProgramError&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;ReadFileError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;ParseError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;MailSendingError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;emailMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EmailMessage&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;LoadEmployees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;EmployeeFilter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;SendBirthdayGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;createSendGreetingsFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;loadEmployees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;LoadEmployees&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;employeeBornToday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EmployeeFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sendBirthDayGreetingMail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SendBirthdayGreetings&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sourceFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;EitherT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;loadEmployees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sourceFile&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;employees&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeBornToday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;EitherT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sendBirthDayGreetingMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a snippet of code from my take on the birthday greetings kata by Matteo Vaccari (full code &lt;a href="https://github.com/eureka84/birthday-greetings-kata-kotlin.git"&gt;here&lt;/a&gt;, tag &lt;code&gt;io-either-version-arrow-0.10.5&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The code per se is pretty straightforward: it will load a list of employees from a csv file, filter the employees born today and then send them a birthday greeting email. &lt;/p&gt;

&lt;p&gt;To execute the program description built using &lt;code&gt;IO&lt;/code&gt;s one need to do something like the following at the edge of his/her world (the main function, your rest controller, etc.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;program&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sendGreetingsToAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/fixtures/bigFile.csv"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unsafeRunSync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: one common mistake one can make is to continuously create and run &lt;code&gt;IO&lt;/code&gt;s. That is not the way (or it is not supposed to be). You should build your entire &lt;strong&gt;description&lt;/strong&gt; of what your program does and then only run it once at the end of your world (so to speak).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The following are the functions in the previous snippet of code that have a side effect and have been modeled with &lt;code&gt;IO&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;LoadEmployees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;SendBirthdayGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is the issue with them? &lt;br&gt;
Well, it's something related to their composition. &lt;br&gt;
Given that their return type is an &lt;code&gt;Either&lt;/code&gt; nested inside an &lt;code&gt;IO&lt;/code&gt;, working with it becomes a little cumbersome because, even if they are both Monads (&lt;code&gt;IO&lt;/code&gt; and &lt;code&gt;Either&lt;/code&gt;), and monads should make it easier to sequence transformations, having two nested monads you should first &lt;code&gt;map&lt;/code&gt; or &lt;code&gt;flatMap&lt;/code&gt; on the external one, &lt;code&gt;IO&lt;/code&gt;,  and then on the internal one, &lt;code&gt;Either&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;One would have hoped to be able to write&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// whatever&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it's not possible. You have to write something like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;ioA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// whatever&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;ioB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="n"&gt;ioA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;eitherA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; 
        &lt;span class="n"&gt;eitherA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;E&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;just&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;theActualA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theActualA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the reason why you have seen in my previous snippet that &lt;code&gt;EitherT&lt;/code&gt;. What is it? It is a Monad Transformer and let you compose two nested monads in case the inner one is an &lt;code&gt;Either&lt;/code&gt;; in lemon terms, it's a data type that wraps the &lt;code&gt;IO&amp;lt;Either&amp;lt;E, A&amp;gt;&amp;gt;&lt;/code&gt; and let you regain the easiness of sequencing operations.&lt;/p&gt;

&lt;p&gt;Let's see how that would apply in the last example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;ioA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// whatever&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;ioB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="nc"&gt;EitherT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ioA&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;theActualA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; 
        &lt;span class="nc"&gt;EitherT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theActualA&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
    &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Monad transformers solve a problem, i.e. the fact that two Monads cannot be generically composed to produce another monad; the question is: is it the right problem to solve? &lt;br&gt;
We have introduced &lt;code&gt;IO&lt;/code&gt; to re-gain purity and referential transparency but it also adds already one wrapper layer around our impure logic; if, when we are using &lt;code&gt;IO&lt;/code&gt; in real life, we end up having an &lt;code&gt;IO&amp;lt;Either&amp;lt;E, A&amp;gt;&amp;gt;&lt;/code&gt;, and to work with it we have to use an &lt;code&gt;EitherT&lt;/code&gt;, adding another extra layer with both a cognitive and performance overhead, one might ask: is it worth it?&lt;/p&gt;
&lt;h1&gt;
  
  
  Suspended functions
&lt;/h1&gt;

&lt;p&gt;The answer is: maybe no. In Arrow 0.11.0-SNAPSHOT the maintainers decided to ditch the IO monad in favour of suspended functions. What does it mean? Let's have a look at the &lt;code&gt;sendBirthdayGreetings&lt;/code&gt; example revised&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;LoadEmployees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;EmployeeFilter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;SendBirthdayGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;SendGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;createSendGreetingsFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;loadEmployees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;LoadEmployees&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;employeeBornToday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EmployeeFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sendBirthDayGreetingMail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SendBirthdayGreetings&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;SendGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sourceFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;loadEmployees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sourceFile&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;employees&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeBornToday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;sendBirthDayGreetingMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can you spot the difference? That's right here it is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;LoadEmployees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;SendBirthdayGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;typealias&lt;/span&gt; &lt;span class="nc"&gt;SendGreetings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the functions that returned an &lt;code&gt;IO&amp;lt;Either&amp;lt;ProgramError, A&amp;gt;&amp;gt;&lt;/code&gt; in the previous version, now simply return an &lt;code&gt;Either&amp;lt;ProgramError, A&amp;gt;&lt;/code&gt; but are marked as &lt;code&gt;suspend&lt;/code&gt;, signaling they need a safe environment to be executed (arrow-fx-coroutines provides such an environment). &lt;/p&gt;

&lt;p&gt;So the &lt;code&gt;suspend&lt;/code&gt; functions take the place of functions returning IO because they are, for all intent and purposes, &lt;strong&gt;delayed&lt;/strong&gt; and conveying the same concept as the &lt;code&gt;IO&lt;/code&gt; monad: something impure is going on.&lt;/p&gt;

&lt;p&gt;Here is how you could run the previous function at the end of your world (in my case in the acceptance test)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;arrow.fx.coroutines.Environment&lt;/span&gt;

&lt;span class="nc"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;unsafeRunSync&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;sendGreetingsToAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/fixtures/bigFile.csv"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Easy, no?&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;IO: to be a Monad or not to be?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Arrow guys answer is: no, thank you. We have already a Kotlin construct that is more than enough to describe impure interactions with the external world: suspended functions. &lt;/p&gt;

&lt;p&gt;What else? I don't know, I only hope to have given you a feel of how to use IO, monad, or not, in a &lt;strong&gt;real-life&lt;/strong&gt; example.&lt;/p&gt;




&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arrow-kt.io/docs/0.10/core"&gt;Arrow docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bartosz Milewski category theory for programmers: &lt;a href="https://www.youtube.com/watch?v=I8LbkfSSR58&amp;amp;list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_"&gt;videos&lt;/a&gt;, &lt;a href="https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/"&gt;book&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Giulio Canti &lt;a href="https://github.com/gcanti/functional-programming"&gt;functional programming notes&lt;/a&gt; (only for those of you who speak Italian and are versed in Typescript) &lt;/li&gt;
&lt;li&gt;Scott Wlaschin visual explanation of the &lt;a href="https://fsharpforfunandprofit.com/posts/elevated-world/"&gt;&lt;strong&gt;elevated world&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html"&gt;A nice little post&lt;/a&gt; explaining functors, applicatives, monoids and monads in pictures &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>functional</category>
      <category>kotlin</category>
      <category>io</category>
    </item>
    <item>
      <title>Domain modeling obsession</title>
      <dc:creator>Angelo Sciarra</dc:creator>
      <pubDate>Sat, 25 Jul 2020 14:55:28 +0000</pubDate>
      <link>https://dev.to/eureka84/domain-modeling-obsession-22ac</link>
      <guid>https://dev.to/eureka84/domain-modeling-obsession-22ac</guid>
      <description>&lt;p&gt;Hi there, &lt;br&gt;
today's topic is "&lt;strong&gt;primitive obsession&lt;/strong&gt;" and why it is important (to avoid it) in your domain modeling. &lt;/p&gt;

&lt;p&gt;What is "&lt;strong&gt;primitive obsession&lt;/strong&gt;"? &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is classified as a code smell and it signals the abuse of primitive data types to represent domain ideas. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think of a class like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;CustomerInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is wrong with it? &lt;/p&gt;

&lt;p&gt;You could think that it is perfectly fine but give it a second thought: does your domain expert talk about Strings or rather Email Addresses? &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Types are important in your design because they act as a live documentation of your domain model and rules. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Consider for example a validation process. I think you all perform some sort of validation of the data coming from the outside world into your domain. &lt;/p&gt;

&lt;p&gt;Let's stick with the email example. &lt;/p&gt;

&lt;p&gt;Suppose you have a function like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;`throwing&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="nf"&gt;email`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toValidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
&lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toValidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Validated&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InvalidEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
&lt;span class="c1"&gt;// omitted &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is wrong with those two functions from a domain modeling point of view? &lt;/p&gt;

&lt;p&gt;Well, what is wrong is that from a type point of view nothing is telling us that the validation process produced a valid Email Address. &lt;/p&gt;

&lt;p&gt;Let's try to improve it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;inline&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Validated&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InvalidEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;EmailAddress&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
&lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much better now: we have a function that is perfectly sound also from a type point of view. It clearly states that it will take as input a &lt;code&gt;String&lt;/code&gt; and will give back either an &lt;code&gt;InvalidEmail&lt;/code&gt; error or an actual &lt;code&gt;EmailAddress&lt;/code&gt;. (If you are curious about the Validated data type have a look &lt;a href="https://arrow-kt.io/docs/0.10/apidocs/arrow-core-data/arrow.core/-validated/"&gt;here&lt;/a&gt;)&lt;/p&gt;

&lt;h1&gt;
  
  
  Why not being obsessed?
&lt;/h1&gt;

&lt;p&gt;I know what may be critics about this way of designing your domain model: too much of a hassle! &lt;/p&gt;

&lt;p&gt;And that may be even true for Java, where adding a class just to have a wrapper has a cost in terms of lines of code you have to maintain (if you think about it, it is a bit weird to have some penalties adding new classes in an OOP language where classes should be the bread and butter of your everyday programming!)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: with Java 14 there is the feature preview of &lt;strong&gt;Record&lt;/strong&gt;s that, even if intended to give an easy way of representing &lt;strong&gt;Value Objects&lt;/strong&gt;, addresses also the problem of wrapper types (even if the ergonomics of records can be improved)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other critics may be linked to performance penalties related to creating too many classes. &lt;/p&gt;

&lt;p&gt;To answer to this line of criticism: performance, unless it is an outmost prerequisite of your domain (say you are designing a realtime engine or whatever), and even in that case, should be addressed later in the design process, i.e. when you have a design to test for performance, and only with the most analytical mindset: measure performances and then think about performance improvements and of course measure again to test your improvements actually worked.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt; The &lt;code&gt;inline class&lt;/code&gt;, shown in the last code example, is an experimental feature of Kotlin, starting from version 1.3. It is designed to reduce the overhead of actually creating real classes and objects at runtime by replacing any instance of the class with the wrapped value. So it is an optimization to let you use wrapper classes to better express your business domain while not having to pay any penalty at runtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Why should you be obsessed?
&lt;/h1&gt;

&lt;p&gt;Should you stop being obsessed at avoiding primitive obsession? No! You should go ALL IN and start modeling to be the more specific you can be at the type level. Consider for example you are modeling an order taking system: your order has a lifecycle and passes through different states. How would you go and model it? &lt;/p&gt;

&lt;p&gt;A first try could be&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;PLACED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;CONFIRMED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;CANCELLED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="c1"&gt;// etc&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OrderItem&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; 
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OrderStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="o"&gt;....&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What do you think? Is it a sound design? Would it be easy to design functions that target a specific order status? Well, no. It would be much easier if you design the entire order as a &lt;strong&gt;choice type&lt;/strong&gt; (or &lt;strong&gt;sum type&lt;/strong&gt; in some circles)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;PlacedOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.):&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;ConfirmedOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.):&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.),&lt;/span&gt; 
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this kind of design, it becomes much easier to define functions that accept orders in a certain state because the order status is encoded in the different choices. &lt;/p&gt;

&lt;p&gt;Ex.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sendConfirmationMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ConfirmedOrder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;What do you gain from being &lt;strong&gt;obsessed&lt;/strong&gt; with avoiding &lt;strong&gt;primitive obsession&lt;/strong&gt;? Well, you gain a codebase that speaks your domain expert language (the so-called &lt;strong&gt;Ubiquitous language&lt;/strong&gt; from DDD circles) and that is less prone to error because you always know what you are dealing with at type level. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt;: most of the concepts expressed in this article summarize, from my point of view, notions and ideas taken from two books you should read if you have not yet: &lt;br&gt;
     - &lt;strong&gt;"Domain Modeling Made Functional"&lt;/strong&gt; by  Scott Wlaschin&lt;br&gt;
     - &lt;strong&gt;"Refactoring: Improving the Design of Existing Code"&lt;/strong&gt; by Martin Fowler&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>oop</category>
      <category>design</category>
      <category>domain</category>
      <category>modeling</category>
    </item>
    <item>
      <title>How to live in a pure world</title>
      <dc:creator>Angelo Sciarra</dc:creator>
      <pubDate>Wed, 15 Jul 2020 07:18:46 +0000</pubDate>
      <link>https://dev.to/eureka84/how-to-live-in-a-pure-world-5fbj</link>
      <guid>https://dev.to/eureka84/how-to-live-in-a-pure-world-5fbj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pnu21iHf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/otkry8574bimpmctmhmg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pnu21iHf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/otkry8574bimpmctmhmg.jpg" alt="To the infinity and beyond"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello folks, &lt;br&gt;
here I am with a follow-up of the previous article &lt;a href="https://dev.to/eureka84/a-matter-of-purity-2flj"&gt;A matter of purity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In it I talked about what is a &lt;strong&gt;pure function&lt;/strong&gt; and why should you even care. &lt;/p&gt;

&lt;p&gt;I can imagine some questions may have arisen while reading it: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to make partial functions total? &lt;/li&gt;
&lt;li&gt;how to make pure and referentially transparent functions that perform some sort of side effect (like IO)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's address these issues one at a time. &lt;/p&gt;
&lt;h1&gt;
  
  
  Make partial functions total
&lt;/h1&gt;

&lt;p&gt;Just to get everybody on the same page let me recall what a partial function is: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;given &lt;code&gt;f: A -&amp;gt; B&lt;/code&gt; f is &lt;strong&gt;partial&lt;/strong&gt; if it is not defined &lt;strong&gt;for all&lt;/strong&gt; a in A. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How can one work on &lt;code&gt;f&lt;/code&gt; to get an &lt;code&gt;f'&lt;/code&gt; such that &lt;code&gt;f'&lt;/code&gt; is total? &lt;/p&gt;

&lt;p&gt;Well, there are 2 paths one can take: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;restrict f domain A to those elements where f is defined, i.e. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;f': A' -&amp;gt; B&lt;/code&gt; where &lt;code&gt;A'&lt;/code&gt; is made of all &lt;code&gt;a in A&lt;/code&gt; such that it exists a &lt;code&gt;b in B&lt;/code&gt; where &lt;code&gt;b = f(a)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thinking about &lt;code&gt;f&lt;/code&gt; as a function we can write in Kotlin or Java this path seems a bit tortuous; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;augment B with a synthetic value that maps all a in A where f is not defined &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;f': A -&amp;gt; B'&lt;/code&gt; where B' is &lt;code&gt;B union { epsilon }&lt;/code&gt; and for all a in A where f is not defined then &lt;code&gt;epsilon = f'(a)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This second approach is the one we can pursue in our code using data types like &lt;code&gt;Option&lt;/code&gt; and &lt;code&gt;Either&lt;/code&gt; because when we say that our function&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;what we are saying is exactly that whenever we cannot return &lt;code&gt;Some(a)&lt;/code&gt; we will return &lt;code&gt;None&lt;/code&gt;. (Same goes for &lt;code&gt;Either&lt;/code&gt;, whenever we cannot return &lt;code&gt;Right(a)&lt;/code&gt; we will return &lt;code&gt;Left(error)&lt;/code&gt;). &lt;/p&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So that should give an answer about totality. &lt;/p&gt;

&lt;h1&gt;
  
  
  Make side effects pure
&lt;/h1&gt;

&lt;p&gt;Once we have made our functions total, have we made them pure? &lt;/p&gt;

&lt;p&gt;What about functions performing IO?&lt;/p&gt;

&lt;p&gt;Let's see an example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;readFileLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;readLines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We know that this function may throw an IOException so, from what we said above about making partial functions total, we could turn it into&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;readFileLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Either&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;readLines&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;right&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the function is total (you can argue that returning IOException as the error type may not be the best design choice, but we'll leave it like that for the time being).&lt;/p&gt;

&lt;p&gt;But is it pure? Is it true that: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;given the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;path&lt;/code&gt; input it will &lt;strong&gt;always&lt;/strong&gt; return the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;Either&lt;/code&gt; value, be it a &lt;code&gt;Right&lt;/code&gt; value or a &lt;code&gt;Left&lt;/code&gt; one?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is no because anytime we call this function we are interacting with the external world and we have no control or knowledge of what this world may look like at any time. &lt;/p&gt;

&lt;p&gt;In the functional universe (well, to be precise, in the Haskell orbiting part) there is an abstraction meant exactly to describe this interaction. Let me introduce you the &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IO (monad)!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Leaving aside the &lt;em&gt;scary&lt;/em&gt; m-word, let's focus on the IO abstraction. &lt;/p&gt;

&lt;p&gt;The idea behind it is simple: given that the interaction with the external world is not predictable, we are going to work with a type that is designed like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;):&lt;/span&gt; &lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// omitted&lt;/span&gt;
&lt;span class="na"&gt;
    [...]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can you see it? All that matters is that &lt;code&gt;() -&amp;gt; A&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Why? &lt;/p&gt;

&lt;p&gt;Because it is as if you are saying: provided that I promise to give you an A, you can transform it via &lt;code&gt;map&lt;/code&gt;, if your transformation is a &lt;strong&gt;pure&lt;/strong&gt; function, or via &lt;code&gt;flatMap&lt;/code&gt;, if  your transformation has again some kind of interaction with the external world. &lt;/p&gt;

&lt;p&gt;We have transformed the &lt;strong&gt;real&lt;/strong&gt;, &lt;strong&gt;unpredictable&lt;/strong&gt; interaction with the external world with a description of it, simply introducing a delay. What we gained by doing so is that this description is once again a &lt;strong&gt;value&lt;/strong&gt;, and we can play around with values freely. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: Kotlin has a construct built in the language, &lt;em&gt;suspended functions&lt;/em&gt;, that can be thought a bit as our delay function (&lt;code&gt;() -&amp;gt; A&lt;/code&gt;). For that reason, the creators and maintainers of Arrow (the functional companion for Kotlin) have decided to redesign their implementation of the IO data type to exploit suspended functions (and coroutines). I promise I will make an article dedicated to it, as soon as I manage to fully understand it myself :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Is it easy to live in a &lt;strong&gt;pure&lt;/strong&gt; world? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not really for me to tell you, only you can judge if what you gain is worth the pain (if you want to call it so). Nonetheless, I think that expanding your horizons and knowing about what it means to live in a &lt;strong&gt;pure&lt;/strong&gt; world will provide you with a new perspective on how to interact with the world that can be useful also if you choose to remain in an &lt;strong&gt;impure&lt;/strong&gt; world. &lt;/p&gt;

&lt;p&gt;I hope to have given you some explanations of concepts you may have heard of but never managed to wrap your head around. &lt;/p&gt;

&lt;p&gt;Well folks, what else to add?  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To infinity and beyond!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>functional</category>
      <category>sideeeffects</category>
      <category>io</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>A matter of purity</title>
      <dc:creator>Angelo Sciarra</dc:creator>
      <pubDate>Thu, 09 Jul 2020 19:06:22 +0000</pubDate>
      <link>https://dev.to/eureka84/a-matter-of-purity-2flj</link>
      <guid>https://dev.to/eureka84/a-matter-of-purity-2flj</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmngjdcgjazxkmd69x8rc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmngjdcgjazxkmd69x8rc.jpg" alt="Graal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello folks, &lt;br&gt;
for my second post I've chosen a more philosophical topic: &lt;strong&gt;pure functions&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I ended my first article talking about the concept of functions in FP, saying that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;functions in FP are just mapping between inputs and outputs (and nothing more)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is an informal definition of &lt;strong&gt;&lt;em&gt;pure functions&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Other definitions you may have heard are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pure functions are functions in the mathematical sense&lt;/li&gt;
&lt;li&gt;pure functions are functions that will return the same output anytime they are given the same input &lt;/li&gt;
&lt;li&gt;pure functions are functions without side effects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mathematical definition of a function is the following: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given two non-empty sets &lt;strong&gt;X&lt;/strong&gt; and &lt;strong&gt;Y&lt;/strong&gt;, a function &lt;strong&gt;&lt;em&gt;f&lt;/em&gt;&lt;/strong&gt; from &lt;strong&gt;X&lt;/strong&gt; to &lt;strong&gt;Y&lt;/strong&gt; is a relation such that &lt;strong&gt;for all&lt;/strong&gt; &lt;em&gt;x&lt;/em&gt; in &lt;em&gt;X&lt;/em&gt; there exists only one &lt;em&gt;y&lt;/em&gt; in &lt;em&gt;Y&lt;/em&gt; such that &lt;em&gt;(x, y)&lt;/em&gt; belongs to &lt;em&gt;f&lt;/em&gt;, or, said otherwise, such that &lt;strong&gt;&lt;em&gt;y = f (x)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(note the &lt;strong&gt;for all&lt;/strong&gt; is crucial because what we are looking for are &lt;strong&gt;total&lt;/strong&gt; functions)&lt;/p&gt;

&lt;p&gt;So, why should you care about pure functions? &lt;/p&gt;

&lt;p&gt;Well, the reason is that the use of pure functions will help you write correct programs. &lt;/p&gt;

&lt;p&gt;How? (you  might be wondering)&lt;/p&gt;

&lt;p&gt;Let's see. &lt;/p&gt;
&lt;h2&gt;
  
  
  Local reasoning
&lt;/h2&gt;

&lt;p&gt;You may have heard about &lt;strong&gt;local reasoning&lt;/strong&gt; or not. What it refers to is the ability to reason about what a piece of code does &lt;strong&gt;in isolation&lt;/strong&gt;, meaning you don't need any knowledge about the context in which said piece of code is executed to understand what it does. &lt;/p&gt;

&lt;p&gt;How pure functions relate to local reasoning? Well, if a function takes care only of transforming an input value in an output one, without relying on any other external piece of information, that function enables of course &lt;strong&gt;local reasoning&lt;/strong&gt; about what it is doing. &lt;/p&gt;

&lt;p&gt;Let's look at an example of a function that does not allow &lt;strong&gt;local reasoning&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;`not&lt;/span&gt; &lt;span class="n"&gt;easy&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt; &lt;span class="nf"&gt;about`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anInt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;anInt&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;anInt&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why is that? Of course, because the logic of the function relies on the &lt;strong&gt;&lt;em&gt;mutable&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;global&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;counter&lt;/em&gt; variable. &lt;/p&gt;

&lt;p&gt;The same example can be translated into a more familiar setting for those of you who are more accustomed to &lt;code&gt;Java&lt;/code&gt; and &lt;code&gt;OOP&lt;/code&gt; (instead of &lt;code&gt;Kotlin&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TheOne&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;notEasyToReasonAbout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;anInt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;     
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anInt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anInt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I guess you have seen many classes like &lt;code&gt;TheOne&lt;/code&gt; shown here. &lt;/p&gt;

&lt;p&gt;What is the problem? Again the fact the method &lt;code&gt;notEasyToReasonAbout&lt;/code&gt; is relying on the value of the &lt;strong&gt;mutable&lt;/strong&gt; &lt;em&gt;counter&lt;/em&gt; that is out of its scope (this time is not &lt;em&gt;global&lt;/em&gt; but still has a lifespan that goes beyond that of the method execution and it can mutate over it). &lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  DISCLAIMER
&lt;/h2&gt;

&lt;p&gt;Am I saying that the OOP way of doing things is intrinsically &lt;strong&gt;impure&lt;/strong&gt;? Not at all. &lt;br&gt;
It is just that languages like Java tend to make it easier to use constructs that work against &lt;strong&gt;local reasoning&lt;/strong&gt; (like mutability) while others (think of modern languages like Kotlin, or Scala) choose to make it easier to use constructs that make it easier to apply &lt;strong&gt;local reasoning&lt;/strong&gt; (examples are the &lt;code&gt;val&lt;/code&gt; keyword that introduces immutable references, the default choice of immutable collections over mutable ones and so on).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Referential transparency
&lt;/h2&gt;

&lt;p&gt;Once you start adopting pure functions in your codebase you gain another capability you were missing before, &lt;strong&gt;referential transparency&lt;/strong&gt;. What is it about? &lt;/p&gt;

&lt;p&gt;Say you have a piece of code like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;aFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;aFunction&lt;/code&gt; is a pure function you gain the ability to safely replace any occurrence of &lt;code&gt;aFunction(y)&lt;/code&gt;, provided that y is immutable, with x, because x will &lt;strong&gt;always&lt;/strong&gt; be the result of applying &lt;code&gt;aFunction&lt;/code&gt; to &lt;code&gt;y&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Have you ever heard of temporal coupling? Well if you use &lt;strong&gt;pure functions&lt;/strong&gt; you can forget about it and move around your values as you please. &lt;/p&gt;

&lt;h3&gt;
  
  
  Question time
&lt;/h3&gt;

&lt;p&gt;Do you think the following function is referentially transparent?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;`read&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="nf"&gt;lines`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;readLines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Answer
&lt;/h4&gt;

&lt;p&gt;No. The reason is that anytime you call this function, even with the same path as input, you are not sure you will get the same results. Reasons may be &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the file doesn't exist anymore (then you'll get an exception)&lt;/li&gt;
&lt;li&gt;the file has been modified (so the content will differ)&lt;/li&gt;
&lt;li&gt;the file permissions have been changed and you no longer have read permission (once again you'll get an exception)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You may be wondering how can one write pure functions that do things like IO but I won't talk about this topic right now (you will have to wait for a new article 😏).&lt;/p&gt;

&lt;h2&gt;
  
  
  Function composition
&lt;/h2&gt;

&lt;p&gt;The beauty of pure functions is that you can &lt;em&gt;compose&lt;/em&gt; them or, going the other way around, you can split a big function into pieces and then compose them together to obtain the initial function.&lt;/p&gt;

&lt;p&gt;If you think about it, writing a program to solve a need can be abstracted to writing one big function that turns our program input in its outputs. &lt;/p&gt;

&lt;p&gt;As usual, the approach one takes is: divide et impera! But what's the point of splitting a problem in subproblems if you cannot glue back the solutions to the subproblems into an overall solution? &lt;/p&gt;

&lt;p&gt;With pure functions, function compositions is a matter of having matching types. &lt;br&gt;
Given &lt;code&gt;f: B -&amp;gt; C&lt;/code&gt; and &lt;code&gt;g: A -&amp;gt; B&lt;/code&gt;, they can be composed to obtain &lt;code&gt;h: A -&amp;gt; C&lt;/code&gt;, because the output type of &lt;code&gt;g&lt;/code&gt; matches the input type of &lt;code&gt;f&lt;/code&gt;, so &lt;code&gt;h = f . g&lt;/code&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Once you start using pure functions, you will start to think more and more in terms of types and of functions as mappings between types. &lt;/p&gt;

&lt;p&gt;Your workflows/use cases (whatever you are calling them) will naturally emerge from the types of the functions you have developed to solve the smaller bits of your problem domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow the types!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will end up doing &lt;strong&gt;TDD&lt;/strong&gt;: Types Driven Development!&lt;/p&gt;

</description>
      <category>functional</category>
      <category>pure</category>
      <category>functions</category>
    </item>
    <item>
      <title>Unchecked vs checked exception (with FP glasses)</title>
      <dc:creator>Angelo Sciarra</dc:creator>
      <pubDate>Mon, 29 Jun 2020 16:37:35 +0000</pubDate>
      <link>https://dev.to/eureka84/unchecked-vs-checked-exception-with-fp-glasses-2528</link>
      <guid>https://dev.to/eureka84/unchecked-vs-checked-exception-with-fp-glasses-2528</guid>
      <description>&lt;p&gt;Hi all,&lt;br&gt;
for my first post/article/whatever here, I have decided to talk about an old argument in the Java community: the dreaded &lt;strong&gt;Checked vs Unchecked exceptions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For those of you who have never heard of this, here is a brief recap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checked Exceptions&lt;/strong&gt;: when calling a method that throws a checked exception the compiler will force you to either handle it with a try-catch block or add it to the signature of your method&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unchecked Exception&lt;/strong&gt;: they extend the RuntimeException class and if not handled simply bubble up in your calls stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dispute on their usage has been controversial, with checked exceptions usually regarded as the black sheep.&lt;/p&gt;

&lt;p&gt;Arguments against checked exception that you could have heard are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Checked exceptions can be ignored by swallowing them, so what's the point of having them?&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// do stuff&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AnnoyingCheckedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// do nothing&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Checked exceptions are easy to ignore by re-throwing them as RuntimeException instances, so what's the point of having them?&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// do stuff&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AnnoyingcheckedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Checked exceptions result in multiple throws clause declarations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The problem with checked exceptions is they encourage people to swallow important details (namely, the exception class). If you choose not to swallow that detail, then you have to keep adding throws declarations across your whole app.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;As far as I can tell, in the Java world the following best practice has been established:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use checked exception for public API&lt;/li&gt;
&lt;li&gt;use &lt;code&gt;RuntimeExceptions&lt;/code&gt; for your internal modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason being that checked exceptions clutter your code (so avoid them inside your module) but document the external behaviour of your API.&lt;/p&gt;

&lt;p&gt;The point I want to make here is that: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;RuntimeExceptions&lt;/code&gt; are &lt;strong&gt;evil&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you feel offended by this argument you're free to stop reading and go out for a walk, they say it's really good for your health!&lt;/p&gt;

&lt;p&gt;Why are they &lt;strong&gt;evil&lt;/strong&gt;? &lt;/p&gt;

&lt;p&gt;Well because whenever you're throwing a &lt;code&gt;RuntimeException&lt;/code&gt; from one method you're telling a &lt;strong&gt;lie&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Which lie?&lt;/p&gt;

&lt;p&gt;Say you have a method like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Money&lt;/span&gt; &lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signum&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ValidationException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"whatever"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Money&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method is lying! It is telling its user it will return an instance of &lt;code&gt;Money&lt;/code&gt; given a &lt;code&gt;BigDecimal&lt;/code&gt; and a &lt;code&gt;String&lt;/code&gt;, but it is not, or at least not always.&lt;/p&gt;

&lt;p&gt;You may say: I can always document this behaviour with a test, but still that is a loose end.&lt;/p&gt;

&lt;p&gt;Another example might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Repository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You know from your experience that the &lt;code&gt;save&lt;/code&gt; method might throw an exception, but you have been told not to use checked exceptions, so you are failing to document it. &lt;/p&gt;

&lt;p&gt;Another couple of considerations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;given their ability to bubble up in the calls stack, &lt;code&gt;RuntimeExceptions&lt;/code&gt; are nothing else than glorified GOTOs&lt;/li&gt;
&lt;li&gt;methods that throw &lt;code&gt;RuntimeExceptions&lt;/code&gt; are more difficult to reason about because you have to keep that information in the back of your mind&lt;/li&gt;
&lt;li&gt;it is too easy not to acknowledge a &lt;code&gt;RuntimeException&lt;/code&gt; has been thrown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checked exceptions, on the other hand, by forcing you to handle them are more &lt;em&gt;honest&lt;/em&gt; and they are actually telling you that the method you are calling returns 2 possible values:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a value of its return type&lt;/li&gt;
&lt;li&gt;or a value of the checked exception type it throws&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By now I guess you might be wondering where I left the FP glasses I mentioned in the title: here they come.&lt;/p&gt;

&lt;p&gt;In the FP world (disclaimer: I am just at the beginning of my journey in this world) there is a type meant to be used to express exactly the choice between two types: &lt;code&gt;Either&amp;lt;E, A&amp;gt;&lt;/code&gt; where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A is the right type (got the hint?), i.e. the type you would have ideally returned&lt;/li&gt;
&lt;li&gt;E is the type of the possible error that may occur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aside from being exactly what you might have been looking for to explicitly state what your method returns, Either is also a &lt;strong&gt;monadic&lt;/strong&gt; data type.&lt;br&gt;
Without going into the rabbit hole of talking about Monads, let's say a monadic data type exposes 2 functions that make it easy to work with the &lt;strong&gt;right&lt;/strong&gt; value once you get an Either into your hands.&lt;/p&gt;

&lt;p&gt;The 2 methods are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;map&lt;/strong&gt; that takes a function &lt;code&gt;f: A -&amp;gt; B&lt;/code&gt; and will turn your &lt;code&gt;Either&amp;lt;E, A&amp;gt;&lt;/code&gt; into an &lt;code&gt;Either&amp;lt;E, B&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;flatmap&lt;/strong&gt; that takes a function &lt;code&gt;f: A -&amp;gt; Either&amp;lt;E, B&amp;gt;&lt;/code&gt; and will still turn your &lt;code&gt;Either&amp;lt;E, A&amp;gt;&lt;/code&gt; into an &lt;code&gt;Either&amp;lt;E, B&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You might be familiar with this 2 new functions because the new Stream API (since java 8) or Optional (again starting from Java 8) support those 2 functions.&lt;/p&gt;

&lt;p&gt;And you may appreciate how they promote a more declarative way of programming.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Either&lt;/code&gt; instead is not in the Java JDK but you can find it in (not an exhaustive list):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VAVR, a functional extension library for Java (&lt;a href="https://www.vavr.io/"&gt;https://www.vavr.io/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Arrow, a functional companion library for Kotlin, but you can use it also in your Java code if you wish (&lt;a href="https://arrow-kt.io/"&gt;https://arrow-kt.io/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;the Scala lang itself (&lt;a href="https://www.scala-lang.org/"&gt;https://www.scala-lang.org/&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The FP way of thinking about functions as mapping between inputs and outputs (and nothing more) brought me to the conclusion that you should always &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Return a value from your function or not return it (maybe the parallel does not work here). There is no try!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, to put it not in Yoda's terms, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A function should be total and always return a value!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well that's all folks.&lt;/p&gt;

&lt;p&gt;Hope you have enjoyed it!&lt;/p&gt;

</description>
      <category>java</category>
      <category>oop</category>
      <category>functional</category>
      <category>exceptions</category>
    </item>
  </channel>
</rss>
