{"componentChunkName":"component---src-templates-blog-post-js","path":"/wth-is-currying/","result":{"data":{"site":{"siteMetadata":{"title":"Yash Gupta"}},"markdownRemark":{"id":"459ff37f-21f1-5f83-a479-3e2a0be2a09b","excerpt":"I know that you’re salivating, perhaps the dev world has become too delicious with JAMStack and now I’m talking about curry? So before you starve to death with…","html":"<p>I know that you’re salivating, perhaps the dev world has become too delicious with JAMStack and now I’m talking about curry? So before you starve to death with these wonders of dev world let me introduce you to what currying is in general.</p>\n<p>Currying was named after <a href=\"https://en.wikipedia.org/wiki/Haskell_Curry\">Haskell Curry</a>, what currying essentially means is taking a function which takes multiple parameter and converting it in to a function which only takes one parameter and returns a functions which then takes the next parameter.</p>\n<p>Currying is not JavaScript specific it is also a mathematical things just like <code class=\"language-text\">function</code> [ Remember good ol’ f(x)? ]</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Not curried</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">add</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">+</span> y\n\n<span class=\"token comment\">// Curried</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">add</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">y</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">+</span> y\n<span class=\"token keyword\">const</span> addFive <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">addFive</span><span class=\"token punctuation\">(</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 11</span></code></pre></div>\n<p>As you can see using Currying we were able to have functions that are more definite in what they do, this in turn greatly simplifies our code.</p>\n<p>With the help of currying we can essentially pre-load functions with an argument in order to receive a new function that remembers those arguments.</p>\n<p>Let’s make a function that can help us in Currying in other functions.\nNow pay close attention,\nThis function is going to take a function <code class=\"language-text\">fn</code> and return a function <code class=\"language-text\">$curry</code> that takes a single argument and performs the operation of the function <code class=\"language-text\">fn</code>.</p>\n<p>Let’s do this step by step</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// This function takes a function `fn` as a parameter.</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Let us determine the arity of `fn`</span>\n  <span class=\"token comment\">// Arity is the number of parameter taken by `fn`</span>\n  <span class=\"token keyword\">const</span> arity <span class=\"token operator\">=</span> fn<span class=\"token punctuation\">.</span>length\n\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> arity <span class=\"token operator\">=</span> fn<span class=\"token punctuation\">.</span>length\n\n  <span class=\"token comment\">// Let's return the $curry function.</span>\n  <span class=\"token comment\">// Let's have all the arguments ( ...args ) being passed in $curry</span>\n  <span class=\"token comment\">// Remember we are returning a function so we can pass args in it.</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">function</span> <span class=\"token function\">$curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> arity <span class=\"token operator\">=</span> fn<span class=\"token punctuation\">.</span>length\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">function</span> <span class=\"token function\">$curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Let's return the function with all the passed arguments.</span>\n    <span class=\"token comment\">// This code maybe stupid until you read the next para...</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">$curry</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We can’t just keep returning functions and functions we need a result. Let it be adding digits together and getting an output.</p>\n<p>Let’s add a condition for this.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> arity <span class=\"token operator\">=</span> fn<span class=\"token punctuation\">.</span>length\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">function</span> <span class=\"token function\">$curry</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&lt;</span> arity<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token function\">$curry</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>By comparing the length of the arguments <code class=\"language-text\">args.length</code> we can know how many arguments have been passed in the function.</p>\n<p>Things will become more clear as I demonstrate how we are using the <code class=\"language-text\">curry</code> function to curry other functions which take multiple parameters.</p>\n<p>For the sake of simplicity let’s take an <code class=\"language-text\">add</code> function which takes 3 values (parameters) and add them together.</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\">add</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> z</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">+</span> y <span class=\"token operator\">+</span> z\n\n<span class=\"token keyword\">const</span> curriedAdd <span class=\"token operator\">=</span> <span class=\"token function\">curry</span><span class=\"token punctuation\">(</span>add<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> addFive <span class=\"token operator\">=</span> <span class=\"token function\">curriedAdd</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// args.length = 1</span>\n\n<span class=\"token keyword\">const</span> addFiveAndSix <span class=\"token operator\">=</span> <span class=\"token function\">addFive</span><span class=\"token punctuation\">(</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// args.length = 2</span>\n\n<span class=\"token keyword\">const</span> output <span class=\"token operator\">=</span> <span class=\"token function\">addFiveAndSix</span><span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// args.length = 3</span>\n\n<span class=\"token comment\">// The funciton can be called now as `args.length` &lt; arity is false.</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 19</span></code></pre></div>\n<p><code class=\"language-text\">args.length</code> is able to give us the number of arguments because of <code class=\"language-text\">return $curry.bind(nullundefined ...args)</code> . The <code class=\"language-text\">$curry</code> function contains all the arguments passed above the any given instance.</p>\n<p>I hope this clears everything about how the function is working. If you have any other doubts you can tweet them to me.</p>\n<p>( @<a href=\"https://twitter.com/yashguptaz\">yashguptaz</a> )</p>\n<h2>Adding Taste to your Code.</h2>\n<p>Currying allows a wonderful phenomenon called partial application.\nAccording to Wikipedia partial application can be defined as -</p>\n<blockquote>\n<p>Partial Application refers to the process of fixing a number of arguments to a function, producing another function of smaller arity.</p>\n</blockquote>\n<p>The definition is pretty straightforward, we reduce the number of parameters a function takes by currying it.</p>\n<p>Let’s <code class=\"language-text\">curry</code> a well known function <code class=\"language-text\">map</code> and see how it changes our life.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Before Currying</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">allTheChildren</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">elements</span> <span class=\"token operator\">=></span> <span class=\"token function\">map</span><span class=\"token punctuation\">(</span>elements<span class=\"token punctuation\">,</span> getChildren<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// Let's curry map</span>\n<span class=\"token keyword\">const</span> map <span class=\"token operator\">=</span> <span class=\"token function\">curry</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fn<span class=\"token punctuation\">,</span> f</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> f<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// AFter Currying</span>\n<span class=\"token keyword\">const</span> allTheChildren <span class=\"token operator\">=</span> <span class=\"token function\">map</span><span class=\"token punctuation\">(</span>getChildren<span class=\"token punctuation\">)</span></code></pre></div>\n<p>The effect becomes really obvious when you are using <code class=\"language-text\">map</code> multiple times. And that’s how we reduce a ton of boilerplate code.</p>\n<p>You can curry pretty much any function that takes more than one parameter. And use Partial Application.</p>\n<p>Isn’t it amazing? Although I am myself a beginner at currying I found it exciting to share. If you want to share something or ask a question or would like to solve or understand something together , you can hook me up on twitter. I am <a href=\"https://twitter.com/yashguptaz\">@yashguptaz</a> on the internet.</p>","frontmatter":{"title":"🍛 What the heck is Currying? ft. JavaScript","date":"March 18, 2020","description":"Currying is an essential part of Functional Programming, let's see what the heck is it."}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/wth-is-currying/","previous":{"fields":{"slug":"/quality-ssr-with-react/"},"frontmatter":{"title":"Quality Server-Side Rendering with React"}},"next":null}}}