{"componentChunkName":"component---src-templates-blog-post-js","path":"/demystifying-functional-programming-with-ramda/","result":{"data":{"site":{"siteMetadata":{"title":"Fabrizio Fortunato","author":"Fabrizio Fortunato","siteUrl":"https://izifortune.com"}},"markdownRemark":{"id":"08b06741-f886-5606-8ac3-36a956419203","excerpt":"A very opinionated introduction to functional programming in Javascript using Ramda. The benefits of using functional programming in Javascript and a first look…","html":"<p>A very opinionated introduction to functional programming in Javascript using <em>Ramda</em>. The benefits of using functional programming in Javascript and a first look at functions composition.</p>\n<p>I also need to say that i’m definitely not an expert on the field but i’m really starting to appreciate the subject and i’m realising all the benefits that it brings to the table.</p>\n<p>Speaking about Javascript at work, yes i work in Ryanair as Lead Frontend Developer, we already banned long time ago the use of <code class=\"language-text\">for</code> and <code class=\"language-text\">while</code> loops ( where performance it’s not an issue ), using only <code class=\"language-text\">map/filter/reduce</code> over the other ones.</p>\n<p>We can say that we are on our journey on functional programming.</p>\n<p>First i want to start by answering the easy questions so:</p>\n<ul>\n<li>What is a functional programming language?</li>\n<li>Why Javascript is a functional programming language?</li>\n</ul>\n<blockquote>\n<p>functional programming is a programming paradigm—a style of building the structure and elements of computer programs—that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data. —Wikipedia.</p>\n</blockquote>\n<p>So what we can get from Wikipedia definition is that is paradigm, like object oriented or imperative programming.\nThe basic <em>computation</em> are functions which lead us to the following question, why Javascript is a functional programming language.</p>\n<p>In javascript functions are <strong><em>first class functions</em></strong>, in fact we can assign a function to variable, as an array element.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">foo</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">'bar'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The other point revolves around functions of course, in javascript you can have a function as a result of another function or you can pass function as a parameter of another function, this is called <strong><em>higher order functions</em></strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">higher</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">f</span> <span class=\"token operator\">=></span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token string\">'bar'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">another</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">'bar'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Why</h2>\n<p>Having introduced a little bit what is functional programming and why javascript is a functional programming language the following question is why we should worry about learning and write in this new paradigm?</p>\n<p>Attention the following statements are very subjective and personal.</p>\n<p>First it comes down to readability, when doing code reviews or peer reviews i can see what is going on inside a pull request without poking the developer asking what is going on inside.</p>\n<p><img src=\"http://i.imgur.com/J1svNp7.jpg\"></p>\n<p>In Ryanair we used different frameworks for different projects, we started out with Angular 1 and now we are moving also to Angular 2, while those two frameworks are very different the paradigm that we are following is the same.</p>\n<p>Frameworks will come and go, yesterday was Backbone, today it’s React tomorrow who knows.</p>\n<p>Learning a new paradigm and particularly functional programming, enables to solve problems in a completely different way, which in my opinion is more elegant and more robust.</p>\n<blockquote>\n<p>Any fool can write code that a computer can understand. Good programmers write code that humans can understand.</p>\n</blockquote>\n<h3>Why not object oriented</h3>\n<p>We followed an <em>object oriented</em> approach at the start of the new web site and we probably stumble into all the problems that comes with it:</p>\n<h4>Inheritance</h4>\n<p>One of the pillar of Object oriented paradigm for code reuse. When using inheritance you are creating a taxonomy, a hierarchy for the concepts that you have to shape. Forcing you to inherit from a single ancestor, in a large project pretty soon you will have the famous <strong><em>gorilla/banana problem</em></strong></p>\n<blockquote>\n<p>The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.</p>\n<p>Joe Armstrong</p>\n</blockquote>\n<p>Interfaces can save you here instead of directly relying on inheritance.</p>\n<h4>Encapsulation</h4>\n<p>Encapsulation is one of the other pillars of <em>object oriented</em> programming, variables are protected from access because they are encapsulated inside the object. In javascript this is true about primitive types which they are passed by value. But objects are passed always through reference which means that the passed object is not safe at all.</p>\n<p>Immutability will rescue here and the use of pure functions, but we will explore them later on.</p>\n<p>Ok stop chatting and now let’s dive into it. We choose <a href=\"http://ramdajs.com\">Ramda</a> as a helper library to start this journey into functional programming. </p>\n<h2>Composition</h2>\n<p>One of the most fundamental concepts of functional programming. Composition let us break down our logic, our operations into smaller functions which later on we can just compose them together.</p>\n<p>If we look at <em>Ramda</em> it exposes different functions for doing this, we start with <code class=\"language-text\">compose</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">compose</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">f<span class=\"token punctuation\">,</span> g</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token function\">g</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">R.compose</code> in <em>Ramda</em> take <em>n</em> functions and as the function name tell compose them together. One thing to note about compose is that we define the functions to execute from right to left.</p>\n<p>We define them right to left because we are following the mathematical composition which applies right to left as well, this way our <code class=\"language-text\">compose</code> will follow the same laws that the mathematical one has: <strong><em>associativity</em></strong></p>\n<p>It doesn’t matter how you group compose, the result will be equivalent.</p>\n<p>Given this data structure for a flight and three functions <em>a</em> <em>b</em> <em>c</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> flight <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  options<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token number\">1</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      globalCode<span class=\"token operator\">:</span> <span class=\"token string\">'foo'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">a</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">data</span> <span class=\"token operator\">=></span> data<span class=\"token punctuation\">.</span>options<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>globalCode<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">b</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">data</span> <span class=\"token operator\">=></span> data<span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">c</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">data</span> <span class=\"token operator\">=></span> data <span class=\"token operator\">+</span> <span class=\"token string\">'-BAR'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>And we want to compose them together</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">compose</span><span class=\"token punctuation\">(</span>\n  <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">compose</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  a\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>flight<span class=\"token punctuation\">)</span> <span class=\"token comment\">//=> 'FOO-BAR'</span></code></pre></div>\n<p>it’s equal to </p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">compose</span><span class=\"token punctuation\">(</span>\n  c<span class=\"token punctuation\">,</span>\n  <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">compose</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>flight<span class=\"token punctuation\">)</span> <span class=\"token comment\">//=> 'FOO-BAR'</span></code></pre></div>\n<p>So how can we leverage composition in javascript and what it enables?</p>\n<p>Let’s see a small example, we want to filter all the flights that have a discount, our flight structure is really nested so we have to walk through it and not all the flights will have this nested attribute so we want to be safe at the same time that we are not causing any errors. </p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getDiscountFlights</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">flights</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> flights<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">flight</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>flight <span class=\"token operator\">&amp;&amp;</span> flight<span class=\"token punctuation\">.</span>options <span class=\"token operator\">&amp;&amp;</span> flight<span class=\"token punctuation\">.</span>options<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span>\n        flight<span class=\"token punctuation\">.</span>options<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>globalCode<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> flight<span class=\"token punctuation\">.</span>options<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>globalCode<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ESDSC'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now let’s try to break down our functions into smaller ones and composed them together:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> hasDiscountCode <span class=\"token operator\">=</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">contains</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ESDSC'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> getGlobalCode <span class=\"token operator\">=</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">pathOr</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span><span class=\"token string\">'options'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'globalCode'</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> getDiscountFlights <span class=\"token operator\">=</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>\n  <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">compose</span><span class=\"token punctuation\">(</span>\n    hasDiscountCode<span class=\"token punctuation\">,</span>\n    getGlobalCode\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This code is more or less equivalent, which one do you think is more readable and maintainable?</p>\n<p>We have introduced some other <em>Ramda</em> functions in here:</p>\n<ul>\n<li><code class=\"language-text\">R.contains</code> will check if our <em>globalCode</em> contains the code <em>ESDSC</em> and you can use it on arrays or objects as well.</li>\n<li><code class=\"language-text\">R.pathOr</code> returns the value at that path for the given object otherwise returns the provided default value.</li>\n</ul>\n<p>In the end we are composing the two functions together to check if the flight has a discount or not.</p>\n<p>Breaking down the functionality into smaller functions allow also to reuse them in different part of the application, avoiding code duplication and also it enables very quick refactoring of the functionality. For example what we could do is extract the <code class=\"language-text\">hasDiscount</code> function into a generic file</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">//util.js</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> hasDiscount <span class=\"token operator\">=</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">compose</span><span class=\"token punctuation\">(</span>\n  <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">contains</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ESDSC'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">pathOr</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">'options'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'globalCode'</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//main.js</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> hasDiscount <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./utils'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getDiscountFlights</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">flights</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>\n    hasDiscount\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>flights<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Reverse compose</h3>\n<p>If instead of applying functions right to left you prefer to apply the functions left to right, <em>Ramda</em> has already a function for it which is called <code class=\"language-text\">pipe</code>.</p>\n<p>It’s just a different flavour of composition and you can choose which one you are more comfortable with it.</p>\n<p>On the next post i will talk about <strong><em>pure functions</em></strong>.</p>","frontmatter":{"title":"Demystifying functional programming with Ramda","date":"February 15, 2017","description":null,"socialImage":{"childImageSharp":{"fixed":{"src":"/dist/static/72c312f02a59fd6e8c04a294115645bc/bdf9d/post_image-2.png"}}},"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsSAAALEgHS3X78AAAAxElEQVQI12P4fl/u2z25p+dlHpySBqKHp0HoxBaJZxdk7p2UfnxW5v9L+fXzJJZPl5w/Qbgglc/PjevKAal/T+W/3pVj+PFA7stduSMbJbYsEls1U2TrYrE9q8RXzBA5uE582xKxG4dB6p6ck7m8X7o6n392j3BFLn9zucD/F2DNQJuBCKji/3P5v2Dy3zN5IPfXIzkI+nJHDmg50KC8FN6dy8VKMvnm9AoDlSE0A1nICOgROIIogNrxTP7DTdnfT+QhXAD46IppFiP+1QAAAABJRU5ErkJggg==","aspectRatio":4.513513513513513,"src":"/dist/static/72c312f02a59fd6e8c04a294115645bc/a5924/post_image-2.png","srcSet":"/dist/static/72c312f02a59fd6e8c04a294115645bc/17cc0/post_image-2.png 167w,\n/dist/static/72c312f02a59fd6e8c04a294115645bc/f7869/post_image-2.png 333w,\n/dist/static/72c312f02a59fd6e8c04a294115645bc/a5924/post_image-2.png 666w,\n/dist/static/72c312f02a59fd6e8c04a294115645bc/997c6/post_image-2.png 999w,\n/dist/static/72c312f02a59fd6e8c04a294115645bc/7f237/post_image-2.png 1332w,\n/dist/static/72c312f02a59fd6e8c04a294115645bc/4ce6a/post_image-2.png 1920w","sizes":"(max-width: 666px) 100vw, 666px"}}}}}},"pageContext":{"slug":"/demystifying-functional-programming-with-ramda/","previous":{"fields":{"slug":"/mvc-is-dead-even-for-angularjs/"},"frontmatter":{"title":"MVC is dead - even for AngularJS"}},"next":{"fields":{"slug":"/unit-testing-angular-applications-with-jest/"},"frontmatter":{"title":"Unit testing Angular applications with Jest"}}}}}