<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Leonardo Borges]]></title>
  
  <link href="http://www.leonardoborges.com/writings/" />
  <updated>2013-04-19T11:02:48+10:00</updated>
  <id>http://www.leonardoborges.com/writings/</id>
  <author>
    <name><![CDATA[Leonardo Borges]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/leonardoborges" /><feedburner:info uri="leonardoborges" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>40.3975</geo:lat><geo:long>-3.714044</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><entry>
    <title type="html"><![CDATA[Functional Programmers Unite! LambdaJam down under]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/hBd3QAgqQ58/" />
    <updated>2013-04-11T11:37:00+10:00</updated>
    <id>http://www.leonardoborges.com/writings/2013/04/11/functional-programmers-unite-lambdajam-down-under</id>
    <content type="html">&lt;p&gt;I hinted at &lt;a href="http://www.yowconference.com.au/lambdajam/"&gt;LambdaJam Australia&lt;/a&gt; back in my &lt;a href="http://www.leonardoborges.com/writings/2013/01/02/so-long-2012-year-highlights/"&gt;2012 Highlights post&lt;/a&gt; and the dates are fast approaching so I thought appropriate to blog about it once more.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.yowconference.com.au/lambdajam/"&gt;YOW! LambdaJam&lt;/a&gt; is a conference targeted at intermediate and advanced functional programmers and is organised in talks, jams and workshops.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Talks&lt;/strong&gt; are the traditional format and are 30 minutes long;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workshops&lt;/strong&gt; aim to introduce a specific subjects to attendees in great detail and are up to two hours long;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jams&lt;/strong&gt; are hands-on sessions. Participants will be guided through pre-defined problems around a given subject/technology and encouraged to work through the solutions either by themselves or ideally as small groups. Jams are also 2 hours long;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Sounds pretty amazing, doesn&amp;#8217;t it?&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re still not convinced, check out the &lt;a href="http://www.yowconference.com.au/lambdajam/Program.html"&gt;program&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The conference will run for 2 days, May 16-17, in Brisbane. &lt;a href="http://yowlambdajam2013.eventbrite.com.au/"&gt;Tickets are on sale&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Clojure&lt;/h3&gt;

&lt;p&gt;Besides the conference itself, &lt;a href="http://clojure.com/"&gt;Clojure/core&lt;/a&gt; will be giving an Intro to Clojure workshop in Sydney, Melbourne and Brisbane. It&amp;#8217;s a great opportunity to learn from the language maintainers.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re attending the conference already, you&amp;#8217;re in luck because there is a 20% off discount &lt;a href="http://yowlambdajam2013.eventbrite.com.au/"&gt;on the link above&lt;/a&gt; if you attend both the conference and the workshop.&lt;/p&gt;

&lt;p&gt;In case you&amp;#8217;d like to attend the workshops only, you can buy individual tickets for &lt;a href="http://clojurecore-sydney.eventbrite.com.au/"&gt;Sydney&lt;/a&gt;, &lt;a href="http://clojurecore-melbourne.eventbrite.com.au/"&gt;Melbourne&lt;/a&gt; and &lt;a href="http://clojurecore-brisbane-eorg.eventbrite.com.au/"&gt;Brisbane&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Scala&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://tmorris.net/"&gt;Tony Morris&lt;/a&gt; will also be delivering a Functional Programming in Scala workshop in Brisbane and 20% off combo tickets can be bought from the &lt;a href="http://yowlambdajam2013.eventbrite.com.au/"&gt;EventBrite page for LambdaJam&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;See you there&lt;/h3&gt;

&lt;p&gt;Got tickets yet? No? What are you waiting for?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/hBd3QAgqQ58" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2013/04/11/functional-programmers-unite-lambdajam-down-under/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Clojure and 'Why calculating is better than scheming']]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/elzowTBY8Hg/" />
    <updated>2013-03-25T11:00:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2013/03/25/clojure-and-why-calculating-is-better-than-scheming</id>
    <content type="html">&lt;p&gt;Last week while attending &lt;a href="http://clojurewest.org"&gt;Clojure/West&lt;/a&gt; in Portland I came across a paper called &lt;a href="http://www.cs.kent.ac.uk/people/staff/dat/miranda/wadler87.pdf"&gt;Why calculating is better than scheming&lt;/a&gt;. In a nutshell, this paper is a critique to &lt;a href="http://en.wikipedia.org/wiki/Hal_Abelson"&gt;Abelson&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Gerald_Jay_Sussman"&gt;Sussman&lt;/a&gt;&amp;#8217;s classic textbook &lt;a href="http://mitpress.mit.edu/sicp/"&gt;SICP - Structure and Interpretation of Computer Programs&lt;/a&gt;,
used by MIT for many years to teach their introductory programming course.&lt;/p&gt;

&lt;p&gt;If you haven&amp;#8217;t read &lt;a href="http://mitpress.mit.edu/sicp/"&gt;SICP&lt;/a&gt;, you should. It&amp;#8217;s an amazing book. It uses &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt;, a dialect of Lisp, as the vehicle to present fundamental programming concepts.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://homepages.inf.ed.ac.uk/wadler/"&gt;Philip Wadler&lt;/a&gt; - the author of this particular paper - contrasts teaching in &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt; to teaching using &lt;a href="http://en.wikipedia.org/wiki/Kent_Recursive_Calculator"&gt;KRC&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Miranda_(programming_language)"&gt;Miranda&lt;/a&gt;, pointing out
four major features he considers important and lacking in &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt;. They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pattern matching&lt;/li&gt;
&lt;li&gt;A syntax close to traditional mathematical notation&lt;/li&gt;
&lt;li&gt;A static type discipline and user-defined types&lt;/li&gt;
&lt;li&gt;Lazy Evaluation&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;Note:  &lt;a href="http://en.wikipedia.org/wiki/Kent_Recursive_Calculator"&gt;KRC&lt;/a&gt; influenced &lt;a href="http://en.wikipedia.org/wiki/Miranda_(programming_language)"&gt;Miranda&lt;/a&gt; which in turn influenced &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt;.  Their syntax is similiar, so where Wadler used Miranda code snippets in the paper, I&amp;#8217;ll be using Haskell in this post.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;As an aside, although the paper talks specifically of &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt;, the term Lisp is used quite loosely and could lead the not-so-careful reader to be misled regarding a whole family of languages. Lisps have come a long way and modern dialects - of which I&amp;#8217;ll be focusing on &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; - address many of the concerns raised by &lt;a href="http://homepages.inf.ed.ac.uk/wadler/"&gt;Wadler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let us begin.&lt;/p&gt;

&lt;h3&gt;Pattern Matching&lt;/h3&gt;

&lt;p&gt;Here Clojure, and most - all? - Lisps, are out of luck.&lt;/p&gt;

&lt;p&gt;The example used in the paper is that of summing all integers in a list. First in Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="kt"&gt;[]&lt;/span&gt;   &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="n"&gt;xs&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nf"&gt;empty?&lt;/span&gt; &lt;span class="nv"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;first &lt;/span&gt;&lt;span class="nv"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;rest &lt;/span&gt;&lt;span class="nv"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The question here is this: Which snippet is easier to read/reason about? the Haskell code!&lt;/p&gt;

&lt;p&gt;I must confess that I, too, miss pattern matching sometimes. However we can still improve our Clojure version to read nicer on the eyes by using &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;destructuring&lt;/a&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;first&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;rest&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nf"&gt;empty?&lt;/span&gt; &lt;span class="nv"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="nv"&gt;first&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="nv"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And that&amp;#8217;s pretty much it. Without proper pattern matching, we can&amp;#8217;t get much better than that.&lt;/p&gt;

&lt;p&gt;In addition to the Haskell snippet being easier to read, it&amp;#8217;s also easier to prove correct by structural induction, as demonstrated in Wadler&amp;#8217;s paper.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Note: &lt;a href="https://github.com/clojure/core.match"&gt;core.match&lt;/a&gt; adds support to pattern matching in Clojure. At the time of this writing, it&amp;#8217;s considered &amp;#8220;alpha quality&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;Data structures&lt;/h3&gt;

&lt;p&gt;The paper continues to discuss exercise 2-27 from the &lt;a href="http://mitpress.mit.edu/sicp/"&gt;SICP&lt;/a&gt;, where the reader has to write code to represent a binary mobile, which consists of a left and right branch with each branch being a rod of certain length, from which hangs either a weight or another binary mobile.&lt;/p&gt;

&lt;p&gt;Translating the Scheme example to Clojure, such a structure is represented using lists, like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;make-mobile&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;make-branch&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="nv"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Wadler then contrasts this with the equivalent Miranda code, translated below to Haskell, taking advantage of &lt;a href="http://www.haskell.org/haskellwiki/Algebraic_data_type"&gt;algebraic data types&lt;/a&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;data&lt;/span&gt; &lt;span class="kt"&gt;Structure&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Weight&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Mobile&lt;/span&gt; &lt;span class="kt"&gt;Branch&lt;/span&gt; &lt;span class="kt"&gt;Branch&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;data&lt;/span&gt; &lt;span class="kt"&gt;Branch&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Branch&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="kt"&gt;Structure&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The first claim is that the Haskell/Miranda data type declaration makes it clearer what the data structure looks like, which is fair.&lt;/p&gt;

&lt;p&gt;Also, the compiler can catch errors early on.&lt;/p&gt;

&lt;p&gt;However, when writing idiomatic Clojure code, here&amp;#8217;s how I&amp;#8217;d actually create this structure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;make-mobile&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;make-branch&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:length&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;:structure&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Granted, it&amp;#8217;s still not as clear and the compiler can&amp;#8217;t validate the shape of our data structure.&lt;/p&gt;

&lt;p&gt;This is however cleaner than the previous version and drives home the point that Clojure isn&amp;#8217;t limited to lists, having literals for other data types such as the hash maps used in this example.&lt;/p&gt;

&lt;p&gt;The second part of this claim is that through custom data types and pattern mathing, extracting values from those structures becomes simpler:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;totalWeight&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Weight&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;totalWeight&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Mobile&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalWeightBranch&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;totalWeightBranch&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;totalWeightBranch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Branch&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalWeight&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Once again Clojure can improve things by taking advantage of its builtin data structures and destructuring:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;total-weight&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;:keys&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nf"&gt;number?&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nv"&gt;structure&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;total-weight-branch&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;total-weight-branch&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;total-weight-branch&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;structure&lt;/span&gt; &lt;span class="nv"&gt;:structure&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;total-weight&lt;/span&gt; &lt;span class="nv"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;For a language with no pattern matching nor algebraic data types, this snippet is clear, concise and elegant - and a real improvement
over the Scheme version discussed in the paper - which was essentially handicapped by the use of lists to simulate &amp;#8216;structs&amp;#8217;.&lt;/p&gt;

&lt;p&gt;As far as Clojure goes, this claim ends here: the next point in the paper, about changing from using &lt;code&gt;list&lt;/code&gt; to using &lt;code&gt;cons&lt;/code&gt;, is rendered moot since
we&amp;#8217;re using hash maps to represent our mobiles.&lt;/p&gt;

&lt;h3&gt;Lisp lists are not self-escaping&lt;/h3&gt;

&lt;p&gt;Creating lists in Clojure goes like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; ((1 2) nil)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; ((1 2) nil)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Both statements above are equivalent, with the second one being clearly more concise.&lt;/p&gt;

&lt;p&gt;The claim here is that the fact that you need to either use the &lt;code&gt;list&lt;/code&gt; function or quote the form is cumbersome and can be confusing to beginners.&lt;/p&gt;

&lt;p&gt;Clojure solves this by providing literals to another data structure - vectors:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Simple and concise - in fact, in idiomatic Clojure code, you&amp;#8217;ll rarely see quoted lists where a vector will do.&lt;/p&gt;

&lt;p&gt;This is possible because both lists and vectors conform to a higher level abstraction called a &lt;a href="http://clojure.org/sequences#Sequences-The%20Seq%20library-Seq%20in,%20Seq%20out"&gt;Seq&lt;/a&gt;, in terms of which most list
operations are defined.&lt;/p&gt;

&lt;p&gt;This eliminates the two following points mentioned in the paper as it allows a beginner to defer his/her understanding of quoted forms
to more advanced lessons/usages.&lt;/p&gt;

&lt;h3&gt;Programs that Manipulate Programs - the interpreter example&lt;/h3&gt;

&lt;p&gt;Here Wadler shows a simple grammar for an interpreter in both Miranda and Scheme.&lt;/p&gt;

&lt;p&gt;He claims that since Haskell/Miranda have free data types, representing such grammar becomes simpler:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;data&lt;/span&gt; &lt;span class="kt"&gt;Term&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Lambda&lt;/span&gt; &lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="kt"&gt;Term&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Apply&lt;/span&gt; &lt;span class="kt"&gt;Term&lt;/span&gt; &lt;span class="kt"&gt;Term&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="kt"&gt;Env&lt;/span&gt; &lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="kt"&gt;Term&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;Env&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;Var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Term&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This is true in that one can easily scan the snippet above and deduce quickly what &lt;code&gt;Term&lt;/code&gt; looks like.&lt;/p&gt;

&lt;p&gt;Then, by using pattern matching, &lt;code&gt;eval&lt;/code&gt; could be implemented like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lookup&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Lambda&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Apply&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I do believe this makes Haskell an excellent choice for writing interpreters and compilers.&lt;/p&gt;

&lt;p&gt;However, the flip side is that entering such terms in Haskell is cumbersome. Consider the term below:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;(λx.(x x)) (λx.(x x))&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This is how to represent this term using the grammar defined above:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Lambda&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Lambda&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Var&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The strength in Lisp lies elsewhere. Since we have quoted forms, entering a similar term is a lot less verbose and closer to its intended representation:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This is, of course, at the expense of making &lt;code&gt;eval&lt;/code&gt; a more complicated function:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;eval&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;variable?&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup&lt;/span&gt; &lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;variable-name&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lambda?&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-closure&lt;/span&gt; &lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lambda-var&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lambda-body&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply?&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;eval &lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-operator&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;eval &lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-operand&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The paper leaves out an important advantage of Lisps though:&lt;/p&gt;

&lt;p&gt;Because we can write code for our made up language directly in its (almost)abstract syntax tree form, Lisps are the ideal choice when writing &lt;a href="http://martinfowler.com/bliki/InternalDslStyle.html"&gt;Internal Domain Specific Languages&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Lazy Evaluation&lt;/h3&gt;

&lt;h4&gt;Lists&lt;/h4&gt;

&lt;p&gt;Haskell and Miranda are lazy languages and that yields a lot of power. This claim is more specific to the use of lazy lists - or sequences, streams - and starts off with a snippet that calculates the sum of squares of all odd numbers from 1 up to 100:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;odd&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;What follows in the paper is a not-so-clear snippet of equivalent functionality using Scheme streams.&lt;/p&gt;

&lt;p&gt;Clojure features lazy sequences and list comprehensions, making the above Haskell example trivial to write:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;:when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;odd?&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;If you&amp;#8217;re following at home with the original paper you&amp;#8217;ll see this is more readable and elegant than the equivalent Scheme example.&lt;/p&gt;

&lt;p&gt;Another - also idiomatic - way to write the same expression is by using a combination of map/filter:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter &lt;/span&gt;&lt;span class="nv"&gt;odd?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Deciding which one is clearer is left as an exercise to the reader.&lt;/p&gt;

&lt;h4&gt;Special forms and lazy evaluation&lt;/h4&gt;

&lt;p&gt;In this section, Wadler brings another example from SICP where the reader wishes to implement his/her own &lt;code&gt;if&lt;/code&gt; form.&lt;/p&gt;

&lt;p&gt;As we know, in order to implement our own version of &lt;code&gt;if&lt;/code&gt;, we need to use macros. That is because in Lisps arguments to functions are eagerly evaluated.&lt;/p&gt;

&lt;p&gt;One might implement it like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defmacro &lt;/span&gt;&lt;span class="nv"&gt;my-if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pred&lt;/span&gt; &lt;span class="nv"&gt;then&lt;/span&gt; &lt;span class="nv"&gt;else&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond &lt;/span&gt;&lt;span class="nv"&gt;~pred&lt;/span&gt; &lt;span class="nv"&gt;~then&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nv"&gt;:else&lt;/span&gt; &lt;span class="nv"&gt;~else&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In Lazy languages, such as Haskell and Miranda, this problem doesn&amp;#8217;t occur allowing such functions to be defined without the need for special and/or quoted forms:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;myIf&lt;/span&gt; &lt;span class="kt"&gt;True&lt;/span&gt;  &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;myIf&lt;/span&gt; &lt;span class="kt"&gt;False&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;However this completely dismisses the power of macros which allow you to extend the language in ways no other language allows - as is extensively demonstrated in books such as &lt;a href="http://amzn.to/14mrrbk"&gt;On Lisp&lt;/a&gt; and &lt;a href="http://amzn.to/WKpMZA"&gt;Let Over Lambda&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As &lt;a href="http://en.wikipedia.org/wiki/Guy_L._Steele,_Jr."&gt;Guy Steele&lt;/a&gt; once put it:  &lt;em&gt;&amp;#8221;[…] If you give someone Lisp, he has any language he pleases&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Hopefully this post doesn&amp;#8217;t come off as trying to invalidate Wadler&amp;#8217;s paper - that is not my intention.&lt;/p&gt;

&lt;p&gt;While I do think a few of the points discussed are only applicable to the domain in which his paper was written - teaching - they are still valid and worth understanding.&lt;/p&gt;

&lt;p&gt;I do however expect to have given you a different perspective on it, showing the strengths of modern Lisps such as Clojure and how it approaches these issues - such as by using its rich set of data structures, literals and techniques such as destructuring.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/elzowTBY8Hg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2013/03/25/clojure-and-why-calculating-is-better-than-scheming/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Purely functional data structures in Clojure: Leftist Heaps]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/-cFdskTVc9U/" />
    <updated>2013-02-03T12:41:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2013/02/03/purely-functional-data-structures-in-clojure-leftist-heaps</id>
    <content type="html">&lt;p&gt;Last year I started reading a book called &lt;a href="http://amzn.to/UcIidh"&gt;Purely Functional Data Structures&lt;/a&gt;. It&amp;#8217;s a fascinating book and if you&amp;#8217;ve ever wondered how Clojure&amp;#8217;s persistent data structures work, it&amp;#8217;s mandatory reading.&lt;/p&gt;

&lt;p&gt;However, all code samples in the book are written in &lt;a href="http://bit.ly/YqYjtt"&gt;ML&lt;/a&gt; - with &lt;a href="http://bit.ly/YqYmp6"&gt;Haskell&lt;/a&gt; versions in the end of the book. This means I got stuck in Chapter 3, where the ML snippets start.&lt;/p&gt;

&lt;p&gt;I had no clue about Haskell&amp;#8217;s - much less ML&amp;#8217;s! - syntax and I was finding it very difficult to follow along. What I did notice is that their syntaxes are not so different from each other.&lt;/p&gt;

&lt;p&gt;So I put the book down and read &lt;a href="http://amzn.to/VuD3jT"&gt;Learn You a Haskell For Great Good!&lt;/a&gt; with the hopes that learning more about haskell&amp;#8217;s syntax - in particular, learning how to read its type signatures - would help me get going with &lt;em&gt;Puretly Functional Data Structures&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Luckily, I was right - and I recommend you do the same if you&amp;#8217;re not familiar with either of those languages. &lt;a href="http://amzn.to/VuD3jT"&gt;Learn You a Haskell For Great Good!&lt;/a&gt; is a great book and I got a lot out of it. &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;My series on Monads&lt;/a&gt; is a product of reading it.&lt;/p&gt;

&lt;p&gt;Enough background though.&lt;/p&gt;

&lt;p&gt;The purpose of this post is two-fold: One is to share the &lt;a href="https://github.com/leonardoborges/purely-functional-data-structures"&gt;github repository&lt;/a&gt; I created and that will contain the Clojure versions of the data structures in the book as well as most solutions to the exercises - or at least as many as my time-poor life allows me to implement.&lt;/p&gt;

&lt;p&gt;The other is to walk you through some of the code and get a discussion going. Hopefully we will all learn something - as I certainly have when implementing these. Today, we&amp;#8217;ll start with Leftist Heaps.&lt;/p&gt;

&lt;h3&gt;Leftist Heaps&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Leftist_tree"&gt;Leftist Heaps&lt;/a&gt; - or trees - are a variant of &lt;a href="http://en.wikipedia.org/wiki/Binary_heap"&gt;binary heaps&lt;/a&gt; that can be used as priority queues. On top of the standard invariants of binary heaps, it obeys the leftist property:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every node has a &lt;em&gt;rank&lt;/em&gt;, which is the distance from its right spine to the nearest leaf&lt;/li&gt;
&lt;li&gt;A node&amp;#8217;s left child has a rank at least as large as its right child&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;In a nutshell, these are the operations we need to be able to perform on a leftist heap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;insert a value into an existing heap&lt;/li&gt;
&lt;li&gt;merge two heaps&lt;/li&gt;
&lt;li&gt;find the minimum value in a heap&lt;/li&gt;
&lt;li&gt;delete the minimum value, returning a new heap&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Since the book uses ML/Haskell, it starts with a data type definition for Heaps that exposes these and a couple of other auxiliary functions. I decided to take a stab at writing the solution using Clojure&amp;#8217;s protocols and records:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defprotocol&lt;/span&gt; &lt;span class="nv"&gt;Heap&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is-empty?&lt;/span&gt;   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt;        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-min&lt;/span&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete-min&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defrecord&lt;/span&gt; &lt;span class="nv"&gt;LeftistHeap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;rank&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;When implementing the algorithms the base case for the recursive solutions will involve dealing with &lt;em&gt;nil&lt;/em&gt; values which at first seems like it wouldn&amp;#8217;t be a problem. However, protocol functions dispatch on the type of its first argument so what happens if I call the function &lt;em&gt;is-empty?&lt;/em&gt; on &lt;em&gt;nil&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Luckily, Clojure allows us to extend a protocol to core types:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;extend-protocol&lt;/span&gt; &lt;span class="nv"&gt;Heap&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nv"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is-empty?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nv"&gt;LeftistHeap&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is-empty?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nil? &lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:rank&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;val-this&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt; &lt;span class="nv"&gt;left-this&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;right-this&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;val-other&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt; &lt;span class="nv"&gt;left-other&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;right-other&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cond&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is-empty?&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&amp;lt;= &lt;/span&gt;&lt;span class="nv"&gt;val-this&lt;/span&gt; &lt;span class="nv"&gt;val-other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ensure-leftist&lt;/span&gt; &lt;span class="nv"&gt;left-this&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                                             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;&lt;span class="nv"&gt;right-this&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                                             &lt;span class="nv"&gt;val-this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;:else&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ensure-leftist&lt;/span&gt; &lt;span class="nv"&gt;left-other&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;right-other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                           &lt;span class="nv"&gt;val-other&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;LeftistHeap&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;           &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-min&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete-min&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;merge &lt;/span&gt;&lt;span class="nv"&gt;right&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Note how I extended a few of the protocol functions to the nil data type, allowing me to continue with this implementation with no nasty hacks.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s one last bit missing: a function that will ensure each heap retains the leftist property:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;ensure-leftist&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;rank-this&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       &lt;span class="nv"&gt;rank-other&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;&amp;gt;= &lt;/span&gt;&lt;span class="nv"&gt;rank-this&lt;/span&gt; &lt;span class="nv"&gt;rank-other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;LeftistHeap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="nv"&gt;rank-other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;LeftistHeap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="nv"&gt;rank-this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;other&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The reason this function is isolated is that the Heap protocol defined above is fairly generic and could be used for defining other types of heaps - and I didn&amp;#8217;t feel it warranted its own interface.&lt;/p&gt;

&lt;p&gt;We can now play with it and create a new leftist heap:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;LeftistHeap&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;While I quite like this approach, I thought I&amp;#8217;d also implement this solution using Clojure&amp;#8217;s core data types - maps in this case - and no protocols. The code is shown below:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;mk-heap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;rank&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:rank&lt;/span&gt; &lt;span class="nv"&gt;rank&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;heap-rank&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;nil? &lt;/span&gt;&lt;span class="nv"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:rank&lt;/span&gt; &lt;span class="nv"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;ensure-leftist-heap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;rank-a&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-rank&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nv"&gt;rank-b&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-rank&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;&amp;gt;= &lt;/span&gt;&lt;span class="nv"&gt;rank-a&lt;/span&gt; &lt;span class="nv"&gt;rank-b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mk-heap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="nv"&gt;rank-b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mk-heap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="nv"&gt;rank-a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;merge-heaps&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;val-a&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt; &lt;span class="nv"&gt;left-a&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;right-a&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;val-b&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt; &lt;span class="nv"&gt;left-b&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;right-b&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cond&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nil? &lt;/span&gt;&lt;span class="nv"&gt;heap-a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nil? &lt;/span&gt;&lt;span class="nv"&gt;heap-b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&amp;lt;= &lt;/span&gt;&lt;span class="nv"&gt;val-a&lt;/span&gt; &lt;span class="nv"&gt;val-b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ensure-leftist-heap&lt;/span&gt; &lt;span class="nv"&gt;val-a&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                                         &lt;span class="nv"&gt;left-a&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                                         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;merge-heaps&lt;/span&gt; &lt;span class="nv"&gt;right-a&lt;/span&gt; &lt;span class="nv"&gt;heap-b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="nv"&gt;:else&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ensure-leftist-heap&lt;/span&gt; &lt;span class="nv"&gt;val-b&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                              &lt;span class="nv"&gt;left-b&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;merge-heaps&lt;/span&gt; &lt;span class="nv"&gt;heap-a&lt;/span&gt; &lt;span class="nv"&gt;right-b&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;heap-insert&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;merge-heaps&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mk-heap&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;               &lt;span class="nv"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;heap-find-min&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;:value&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;heap-delete-min&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt; &lt;span class="nv"&gt;:left&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt; &lt;span class="nv"&gt;:right&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;merge-heaps&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Using it is equally simple:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mk-heap&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-insert&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-insert&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-insert&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-insert&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-insert&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heap-insert&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That&amp;#8217;s it for now.&lt;/p&gt;

&lt;p&gt;As I implement more of the book&amp;#8217;s code and exercises I&amp;#8217;ll add them to the &lt;a href="https://github.com/leonardoborges/purely-functional-data-structures"&gt;github repo&lt;/a&gt; - it also includes tests for all implementations.&lt;/p&gt;

&lt;p&gt;Enjoy :)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/-cFdskTVc9U" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2013/02/03/purely-functional-data-structures-in-clojure-leftist-heaps/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Announcing bouncer, a validation library for Clojure Apps]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/Fnv5XGRJlGI/" />
    <updated>2013-01-04T17:39:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2013/01/04/bouncer-validation-lib-for-clojure</id>
    <content type="html">&lt;p&gt;Today I&amp;#8217;m releasing bouncer, which was extracted from a project I&amp;#8217;ve been working on.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s a validation library for Clojure apps and it lets you write code like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Leo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt; &lt;span class="nv"&gt;person&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:name&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:age&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;required&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;If you&amp;#8217;d like to see more examples and a detailed guide check out the &lt;a href="http://github.com/leonardoborges/bouncer"&gt;github repository&lt;/a&gt;. The README should get you started.&lt;/p&gt;

&lt;p&gt;This post however isn&amp;#8217;t only about announcing bouncer. It&amp;#8217;s also about the motivation and implementation details behind it.&lt;/p&gt;

&lt;p&gt;There are a couple of Clojure validation libraries already out there so why would I write a new one?
Well&amp;#8230;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Writing Clojure is fun! (who knew? :P)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Because I believe this problem can be solved more elegantly with the use of Monads&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;If you&amp;#8217;ve been following me for a while, you&amp;#8217;ll know that I spent most of 2012 deepening my knowledge about functional programming.&lt;/p&gt;

&lt;p&gt;In that journey, the unavoidable subject of monads came about - and it was both interesting and enlightening enough that made me &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;write a whole series of posts about it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After learning what they are and then thinking about the validation problem for a while, I couldn&amp;#8217;t help but notice that the problem had a lot in common with the &lt;a href="http://www.haskell.org/haskellwiki/State_Monad"&gt;State Monad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In order to explain how the two relate, I&amp;#8217;ll have to digress for a moment. It&amp;#8217;ll all make sense in the end - or so I hope&lt;/p&gt;

&lt;h2&gt;Purity&lt;/h2&gt;

&lt;p&gt;In pure functional languages, such as Haskell, functions can&amp;#8217;t have side effects. These include performing IO, changing global variables or launching missiles.&lt;/p&gt;

&lt;p&gt;Because of that, functions in Haskell are pure: if you repeatedly call a function &lt;em&gt;f&lt;/em&gt; with the same argument &lt;code&gt;x&lt;/code&gt; over time you will &lt;em&gt;always&lt;/em&gt; get the same result back.&lt;/p&gt;

&lt;p&gt;Pure functions are not a feature of Haskell though. We, too, can write pure functions if we wish:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;double&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The function &lt;code&gt;double&lt;/code&gt; above is pure. If we call it with 10, we can be sure the result will always be 20.&lt;/p&gt;

&lt;p&gt;This leaves us with a question though: If we were to write our programs with pure functions only, how would we perform computations that need to carry state - state that needs to change over time - around?&lt;/p&gt;

&lt;p&gt;A good example of such computation is generating random numbers.&lt;/p&gt;

&lt;p&gt;Most programming languages provide generators capable of creating random numbers on demand. Using them is usually trivial. Here&amp;#8217;s an example in Java:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;gen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextDouble&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 0.0037635726242281065&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextDouble&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 0.15821091918430885&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;Impurity alert!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The function &lt;code&gt;nextDouble&lt;/code&gt; above is obviously &lt;em&gt;not&lt;/em&gt; pure. Multiple invocations of it with the same argument - in this case, none - returns different results.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nextDouble&lt;/code&gt;  is keeping some sort of global state between function calls.&lt;/p&gt;

&lt;p&gt;This is where the State Monad comes in. It allows such functions to remain pure.&lt;/p&gt;

&lt;h2&gt;The State Monad&lt;/h2&gt;

&lt;p&gt;The State Monad provides a way to abstract &lt;em&gt;state&lt;/em&gt; from the function that needs to operate on it.&lt;/p&gt;

&lt;p&gt;Sounds confusing? Hopefully an example will clear things up.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s have a look at the clojure function &lt;code&gt;rand&lt;/code&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; 0.04388682005715605&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; 0.43057496371080517&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;code&gt;rand&lt;/code&gt; suffers from the same problem as &lt;code&gt;nextDouble&lt;/code&gt; we saw above. It keeps it&amp;#8217;s own state that is shared across calls, therefore being an impure function.&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s write a pure version of &lt;code&gt;rand&lt;/code&gt;. We&amp;#8217;ll call it &lt;code&gt;pure-rand&lt;/code&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;gen&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;pure-rand&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nextDouble&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure-rand&lt;/span&gt; &lt;span class="nv"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; [0.5783608063218478 #&amp;lt;Random java.util.Random@7f30ab6&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure-rand&lt;/span&gt; &lt;span class="nv"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; [0.9251968987499839 #&amp;lt;Random java.util.Random@7f30ab6&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This is interesting. &lt;code&gt;pure-rand&lt;/code&gt; now takes a generator as an argument and returns a two-element vector containing the random number itself - the result we&amp;#8217;re actually interested in - and the generator that was passed in.&lt;/p&gt;

&lt;p&gt;Recall however that the generator returned, albeit the same object, is in a new sate.&lt;/p&gt;

&lt;p&gt;By re-writing the function like this, we&amp;#8217;ve regained purity, as demonstrated below:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure-rand&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; [0.7220096548596434 #&amp;lt;Random java.util.Random@bb14fe1&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure-rand&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; [0.7220096548596434 #&amp;lt;Random java.util.Random@bb14fe1&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, as long as we provide the same generator - the same argument - we get the same result back.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re wondering why I&amp;#8217;m returning a two element vector from our little function, the answer lies in the State Monad implementation as found in the &lt;a href="https://github.com/clojure/algo.monads/"&gt;algo.monads&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;From its docstring:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;State Monad&lt;/strong&gt;: Monad describing stateful computations. The monadic values have the structure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(fn [old-state] [result new-state]).
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;It expects a function that receives its old state and returns the result and the new state - these are called monadic values.&lt;/p&gt;

&lt;p&gt;By designing the function to follow this contract, we can leverage the &lt;code&gt;domonad&lt;/code&gt; macro - think of it as syntactic sugar for working with monads:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;clojure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;algo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;monads&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;m&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;m/domonad&lt;/span&gt; &lt;span class="nv"&gt;m/state-m&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;pure-rand&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="nv"&gt;pure-rand&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;c&lt;/span&gt; &lt;span class="nv"&gt;pure-rand&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; [[0.7220096548596434 0.19497605734770518 0.6671595726539502] &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; #&amp;lt;Random java.util.Random@358ddfd6&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In the example above, we&amp;#8217;re using our &lt;code&gt;pure-rand&lt;/code&gt; function in the context of the State Monad to generate 3 random numbers - based on some initial state - and returning them as a vector.&lt;/p&gt;

&lt;p&gt;As we&amp;#8217;ve seen before the result is itself in a vector alongside the new state.&lt;/p&gt;

&lt;p&gt;This is where the State Monad and the validation problem meet:&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://github.com/leonardoborges/bouncer"&gt;bouncer&lt;/a&gt;, each validation function is designed to be compatible with the State Monad, just like &lt;code&gt;pure-rand&lt;/code&gt; above:&lt;/p&gt;

&lt;p&gt;It receives an initial state - at first, the map to be validated - and returns a vector with the map of errors and the new state: the original map augmented with any errors from previous validators.&lt;/p&gt;

&lt;p&gt;The end result, should one or more validations fail, is a map with all errors that might have happened, plus our new state.&lt;/p&gt;

&lt;p&gt;Now if you head to the &lt;a href="http://github.com/leonardoborges/bouncer"&gt;github repository&lt;/a&gt; and read the examples by keeping the State Monad and the above explanation in mind, the similarities should be obvious.&lt;/p&gt;

&lt;h2&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;As I mentioned in the beginning of the article, there are &lt;a href="https://github.com/r0man/validation-clj"&gt;other&lt;/a&gt; validation &lt;a href="https://github.com/michaelklishin/validateur"&gt;libraries&lt;/a&gt; for Clojure and at the time of this writing they have more features than &lt;a href="http://github.com/leonardoborges/bouncer"&gt;bouncer&lt;/a&gt; - by all means have a look at them.&lt;/p&gt;

&lt;p&gt;However I will keep maintaining &lt;a href="http://github.com/leonardoborges/bouncer"&gt;bouncer&lt;/a&gt; for a couple of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;That&amp;#8217;s what I&amp;#8217;m using in my current side project&lt;/li&gt;
&lt;li&gt;It takes a fundamentally different implementation approach that is in itself worthy of exploration&lt;/li&gt;
&lt;li&gt;If nothing else, this is yet another example of where Monads can be useful.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Acknowledgments&lt;/h4&gt;

&lt;p&gt;Thanks to &lt;a href="https://twitter.com/stevebuik"&gt;Steve&lt;/a&gt; and &lt;a href="https://twitter.com/juliansgamble"&gt;Julian&lt;/a&gt; for reviewing early drafts of this post as well as &lt;a href="https://twitter.com/nick_s_drew"&gt;Nick&lt;/a&gt; for being such a PITA :) - our discussions led to a considerably nicer design.&lt;/p&gt;

&lt;p&gt;As usual, let me know your thoughts.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/Fnv5XGRJlGI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2013/01/04/bouncer-validation-lib-for-clojure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[So long 2012: Year highlights]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/bx7Mb6IE0L0/" />
    <updated>2013-01-02T13:05:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2013/01/02/so-long-2012-year-highlights</id>
    <content type="html">&lt;p&gt;Keeping the tradition of end-of-year blog posts, here are my year highlights for 2012:&lt;/p&gt;

&lt;h2&gt;Clojure&lt;/h2&gt;

&lt;p&gt;I started &lt;a href="http://www.meetup.com/clj-syd/"&gt;clj-syd&lt;/a&gt; - the Sydney Clojure User Group - back in January and it has seen a major uptake. We consistently get an average of 25 people each month and there&amp;#8217;s no shortage of talks and topics to discuss. It&amp;#8217;s a great crowd and I&amp;#8217;m proud to have started it and of being part of it.&lt;/p&gt;

&lt;h2&gt;Speaking&lt;/h2&gt;

&lt;p&gt;I spent most of the year studying functional programming and I tried to make my talks reflect that. Even the javascript talk I gave in April had a FP focus. Anyway, you can find some of the slides online:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.slideshare.net/borgesleonardo/the-many-facets-of-code-reuse-in-javascript"&gt;The many facets of code reuse in JavaScript&lt;/a&gt; - this was given at a ThoughtWorks technical event in April&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.slideshare.net/borgesleonardo/continuation-passing-style-and-macros-in-clojure-jan-2012"&gt;Continuation Passing Style and Macros in Clojure&lt;/a&gt; - this is the talk I gave at our first Clojure meetup in Sydney&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.slideshare.net/borgesleonardo/clojure-reducers-cljsyd-aug-2012"&gt;Clojure Reducers&lt;/a&gt; - Another preso I gave at the clojure user group, in August.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Books&lt;/h2&gt;

&lt;p&gt;As usual I read a number of books this year and these are my favourites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Little Schemer&lt;/li&gt;
&lt;/ul&gt;


&lt;iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;IS2=1&amp;nou=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=leonaborge-20&amp;o=1&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=qf_sp_asin_til&amp;asins=0262560992" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;


&lt;p&gt;As they say, an oldie but a goodie. This is mandatory reading for anyone who consider themselves a serious programmer. The insights and techniques found here are invaluable. Do yourself a favor and buy it now.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;For a Clojure take on it, check &lt;a href="https://twitter.com/juliansgamble"&gt;Julian Gamble&lt;/a&gt;&amp;#8217;s series on &lt;a href="http://juliangamble.com/blog/2012/07/20/the-little-schemer-in-clojure-chapter-1/"&gt;The Little Schemer in Clojure&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;The Joy of Clojure&lt;/li&gt;
&lt;/ul&gt;


&lt;iframe src="http://rcm.amazon.com/e/cm?t=leonaborge-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1935182641&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;


&lt;p&gt;This is pretty much how I learned Clojure. I actually started reading it in November 2011 but felt I needed to put it down from time to time to go and code on my own to solidify what I learned. That&amp;#8217;s why I only finished it in 2012.&lt;/p&gt;

&lt;p&gt;This book packs a great deal of info and is a great way to get into both functional programming and Clojure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn you a Haskell for Great Good&lt;/li&gt;
&lt;/ul&gt;


&lt;iframe src="http://rcm.amazon.com/e/cm?t=leonaborge-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1593272839&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;


&lt;p&gt;This is the best intro to Haskell ever. Hands down. &amp;#8216;nuff said.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clojure Programming&lt;/li&gt;
&lt;/ul&gt;


&lt;iframe src="http://rcm.amazon.com/e/cm?t=leonaborge-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1449394701&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;


&lt;p&gt;I like reading different books about the same subject to get to see it from various perspectives. &lt;em&gt;Clojure Programming&lt;/em&gt; takes a different approach to &lt;em&gt;The Joy of Clojure&lt;/em&gt; in that, as it progresses through topics and code examples, it contrasts it with languages likely to be familiar to the reader, such as Java, Ruby and Python. Another great alternative if you&amp;#8217;ve been thinking of getting into Clojure but didn&amp;#8217;t know where to start.&lt;/p&gt;

&lt;h2&gt;Content&lt;/h2&gt;

&lt;p&gt;Here&amp;#8217;s just a few of the posts visitors found most interesting this year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Monads in Small Bites&lt;/a&gt; Parts &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;I&lt;/a&gt;, &lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;II&lt;/a&gt;, &lt;a href="http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/"&gt;III&lt;/a&gt; &amp;amp; &lt;a href="http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads/"&gt;IV&lt;/a&gt; - Even though I only published this series in December, it quickly became one of the most read posts that month. And it&amp;#8217;s also a personal favorite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/05/03/build-automation-with-xcode-4-dot-3-kif-and-jenkins/"&gt;Build Automation With XCode 4.3, KIF and Jenkins&lt;/a&gt; - This turned out to be very popular - build automation and testing are not among the top priorities within the iOS community so I&amp;#8217;m glad this helped some people out. It&amp;#8217;s getting way better now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2011/07/30/hiring-good-people-is-really-simple/"&gt;Hiring Good People Is Really Simple&lt;/a&gt; - Another one high up in my analytics, and it still stands true.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2009/07/01/jruby-on-rails-and-legacy-java-apps-managing-dependencies/"&gt;JRuby on Rails and Legacy Java Apps: Managing Dependencies&lt;/a&gt; - The JRuby enterprise world seems to be hotter than ever before. I wouldn&amp;#8217;t think this post from 2009 would still get this many visits. I haven&amp;#8217;t been involved much with JRuby as of late so I wonder if this is still the way to go?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;LambdaJam&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://lambdajam.com/"&gt;LambdaJam&lt;/a&gt; is a conference for functional programmers and although it&amp;#8217;s set to happen in May 2013 the wheels have already started turning - thus I had to list it as a highlight.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m fortunate enough to be involved with the organization alongside very bright people from the Australian functional programming community as well as Dave Thomas from the &lt;a href="http://www.yowconference.com.au/"&gt;YOW! Conference&lt;/a&gt; who&amp;#8217;s leading the effort. We&amp;#8217;re all really excited about it.&lt;/p&gt;

&lt;p&gt;Stay tuned, lots more info to come!&lt;/p&gt;

&lt;h2&gt;Goals&lt;/h2&gt;

&lt;p&gt;No resolutions. Goals. And I wanna achieve them. They&amp;#8217;re simple and I hope this post will keep me in check&lt;/p&gt;

&lt;h3&gt;Better utilize my free time&lt;/h3&gt;

&lt;p&gt;This is a bit abstract but will help me achieve the goals below. The output of this goal is a calendar with time slots assigned to each one of the next goals - I&amp;#8217;ve just done this now actually so this is a good start. No more procrastinating.&lt;/p&gt;

&lt;h3&gt;Books&lt;/h3&gt;

&lt;p&gt;I got a big pile of books I wanted to have read in 2012 so I&amp;#8217;ll be updating my &lt;a href="goodreads.com/leonardoborges"&gt;good reads profile&lt;/a&gt; with them and make sure I just do it - with the help of my new calendar from the goal above.&lt;/p&gt;

&lt;h3&gt;Side projects&lt;/h3&gt;

&lt;p&gt;In 2012 I worked on two side project which are not ready yet, so I can&amp;#8217;t comment a whole lot on them apart from saying that one is being developed in Clojure and the other in Ruby - in 2013, these two will see the light of day.&lt;/p&gt;

&lt;h2&gt;Here&amp;#8217;s to a new year&lt;/h2&gt;

&lt;p&gt;I hope you all had a great 2012 and are as excited as I am for the new year.&lt;/p&gt;

&lt;p&gt;Happy holidays, safe driving and awesome parties! :)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/bx7Mb6IE0L0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2013/01/02/so-long-2012-year-highlights/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Monads in small bites - Part IV - Monads]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/e2d4JDHipLk/" />
    <updated>2012-12-08T17:36:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads</id>
    <content type="html">&lt;p&gt;This is Part IV of my Monads tutorial. Make sure you read the previous parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I   - Functors&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Part II  - Applicative Functors&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/"&gt;Part III - Monoids&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Part IV  - Monads (this post)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;A quick recap&lt;/h3&gt;

&lt;p&gt;In &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I&lt;/a&gt; we learned about &lt;em&gt;Functors&lt;/em&gt;, which are things that can be mapped over using a normal function - &lt;code&gt;fmap&lt;/code&gt; is used for that.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Part II&lt;/a&gt; tought us that when our Functors themselves contain functions and we want them applied to the values contained in other Functors, &lt;em&gt;Applicatives&lt;/em&gt; come to the rescue - and bring theirs friends &lt;code&gt;pure&lt;/code&gt; and &lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/"&gt;Part III&lt;/a&gt; introduced Monoids which model a special type of relationship involving binary functions and their identity values.&lt;/p&gt;

&lt;p&gt;Now it&amp;#8217;s time for what I hope is the post you have all been waiting for :)&lt;/p&gt;

&lt;h3&gt;Monads&lt;/h3&gt;

&lt;h4&gt;A word on context&lt;/h4&gt;

&lt;p&gt;So far I&amp;#8217;ve said things such as &lt;em&gt;wrapping&lt;/em&gt; stuff in Functors, &lt;em&gt;unwrapping&lt;/em&gt; functions from Applicatives and putting results into minimal Functors. All this really means is that [Applicative]Functors - and Monads - have associated contexts that model some sort of computation.&lt;/p&gt;

&lt;p&gt;For lists, for example, this means they represent computations that can have several results - non-determinism.&lt;/p&gt;

&lt;p&gt;These computations can have much greater implications though - they can represent failure (or not!), do IO and even launch nuclear missiles. The point is: when we combine Functors/Applicatives/Monads, we carry their context with us to the end - they are essentially &lt;em&gt;sequenced&lt;/em&gt; together.&lt;/p&gt;

&lt;p&gt;This will become clearer with an example. For once I won&amp;#8217;t start with lists - w00t! - so get ready for it!&lt;/p&gt;

&lt;h3&gt;The Maybe Monad&lt;/h3&gt;

&lt;p&gt;The Maybe monad models computations that can fail. Let&amp;#8217;s have a look at an example.&lt;/p&gt;

&lt;p&gt;Say you have an e-commerce system. When placing an order, a few things need to get done:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gather information about the order;&lt;/li&gt;
&lt;li&gt;calculate shipping rates;&lt;/li&gt;
&lt;li&gt;apply discount codes, if any, and;&lt;/li&gt;
&lt;li&gt;finally place the order.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The code below shows the supporting functions that will be orchestrated in order to achieve this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;address&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;= &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:country&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Australia&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="mf"&gt;10.0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;:total&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:total&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;= &lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;XMAS2012&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="mf"&gt;5.0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;apply-discount-code&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;:total&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;- &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:total&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;place&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;prn &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Off you go! Order total: $&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:total&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Note that based on the code above, we can &lt;em&gt;only&lt;/em&gt; ship to Australia and there is &lt;em&gt;only one&lt;/em&gt; active discount code. Keep this in mind - you&amp;#8217;ll see why later on.&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s place an order for some Jalapeño sauce:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:items&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Jalapeño sauce&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;:price&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:address&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:country&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Australia&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:discount-code&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;XMAS2012&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:total&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;discount&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; &amp;quot;Off you go! Order total: $25.0&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Great! Soon I&amp;#8217;ll be receiving some hot sauce to go with my burritos!&lt;/p&gt;

&lt;p&gt;But wait, what if I had mistakenly set my address to somewhere other than Australia? How would this code behave?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;another-order&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:items&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Jalapeño sauce&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;:price&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:address&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:country&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Brazil&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:discount-code&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;HACKERZ&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:total&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;another-order&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;discount&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;another-order&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;another-order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; NullPointerException   [trace missing]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;Oops&lt;/strong&gt;! Your e-commerce system just crashed! Not cool. But hey, this is easy to fix, right? We could just change our &lt;em&gt;apply-shipping-costs&lt;/em&gt; function to something like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nv"&gt;shipping-rate&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;:total&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:total&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;Remember we only support one discount code so the same problem could happen again&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;We need to change the apply-discount-code function as well&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;apply-discount-code&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nv"&gt;discount&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;:total&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;- &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:total&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now let&amp;#8217;s see what happens:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;another-order&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;discount&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;another-order&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;another-order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; &amp;quot;Off you go! Order total: $15.0&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Well, it doesn&amp;#8217;t &lt;em&gt;crash&lt;/em&gt; but we can&amp;#8217;t ship to Brazil anyway! So the code is &lt;em&gt;still&lt;/em&gt; incorrect! What we really want is a way to halt the whole computation - placing an order - if any of those steps fail.&lt;/p&gt;

&lt;p&gt;Of course we could fix it with a couple more &lt;em&gt;if&lt;/em&gt; forms before trying to call the &lt;em&gt;place&lt;/em&gt; function but you see where this is going.&lt;/p&gt;

&lt;p&gt;Essentially our nice little functions became burdened with &lt;em&gt;context&lt;/em&gt;: each of them is now aware that they can fail and need to cater for it.&lt;/p&gt;

&lt;h3&gt;Enter the Monad&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;ll jump straight to how the code could look like if we had monads - it won&amp;#8217;t work now because we haven&amp;#8217;t actually implemented the monad yet, but this should whet your appetite.&lt;/p&gt;

&lt;p&gt;Also, assume we reversed the changes from before - the functions don&amp;#8217;t have the &lt;em&gt;if&lt;/em&gt; forms checking its arguments any longer, just like in the original version. Here&amp;#8217;s the code:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;domonad&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;discount&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;&amp;quot;Off you go! Order total: $25.0&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;domonad&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;another-order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;discount&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; nil&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;code&gt;domonad&lt;/code&gt; receives the monad you want to operate on, a vector of bindings and an expression that&amp;#8217;s the final result of the whole thing.&lt;/p&gt;

&lt;p&gt;Is your mind blown yet? :) Somehow the whole operation fails and yields &lt;code&gt;nil&lt;/code&gt; in the second call to &lt;em&gt;domonad&lt;/em&gt; above - without any &lt;em&gt;if&lt;/em&gt; forms and without crashing! To see why that is, I&amp;#8217;ll now explain the monad type class from Haskell.&lt;/p&gt;

&lt;h3&gt;The Monad Type Class&lt;/h3&gt;

&lt;p&gt;Here&amp;#8217;s the Haskell definition of the Monad type class (I left the &lt;code&gt;fail&lt;/code&gt; function out so we can focus on the core of it):&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Monad&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&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="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="kr"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s distill those bad ass type signatures:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; - much like &lt;code&gt;pure&lt;/code&gt; from &lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Applicative Functors&lt;/a&gt;, &lt;code&gt;return&lt;/code&gt; is responsible for wrapping a value of type &lt;code&gt;a&lt;/code&gt; into a minimum context Monad that yields a value of type &lt;code&gt;a&lt;/code&gt; - referred to as a &lt;em&gt;monadic value&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(&gt;&gt;=)&lt;/strong&gt; - often called &lt;code&gt;bind&lt;/code&gt; - is a function of two arguments. The first is a &lt;em&gt;monadic value&lt;/em&gt; of type &lt;code&gt;a&lt;/code&gt; and the second is a function that receives a value of type &lt;code&gt;a&lt;/code&gt; and returns a monadic value of type &lt;code&gt;m b&lt;/code&gt; which is also the overall result of the function.&lt;/p&gt;

&lt;p&gt;In other words: &lt;code&gt;bind&lt;/code&gt; &lt;em&gt;runs&lt;/em&gt; the monad &lt;code&gt;m a&lt;/code&gt;, feeding the yielded &lt;code&gt;a&lt;/code&gt; value into the function it received as an argument - any context carried by that monad will be taken into account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(&gt;&gt;)&lt;/strong&gt; - often called &lt;code&gt;then&lt;/code&gt; - This function receives two monads, &lt;code&gt;m a&lt;/code&gt; and &lt;code&gt;m b&lt;/code&gt;, and returns a monad of type &lt;code&gt;m b&lt;/code&gt;. It is generally used when you&amp;#8217;re interested in the side effects - the context - carried out by the monad &lt;code&gt;m a&lt;/code&gt; but doesn&amp;#8217;t care about the value &lt;code&gt;a&lt;/code&gt; it yields.  It&amp;#8217;s rarely implemented in specific monads because the type class provides a default implementation:&lt;/p&gt;

&lt;p&gt;It applies &lt;code&gt;bind&lt;/code&gt; to the monad &lt;code&gt;x&lt;/code&gt; and a function that ignores its argument (&lt;code&gt;\_ -&amp;gt; y&lt;/code&gt;) - which by convention is represented by an &lt;em&gt;underscore&lt;/em&gt; - and simply yields the monad &lt;code&gt;y&lt;/code&gt;: that&amp;#8217;s the final result of the computation.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I won&amp;#8217;t be implementing &lt;code&gt;then&lt;/code&gt; in Clojure though - I&amp;#8217;ll focus on &lt;code&gt;return&lt;/code&gt; and &lt;code&gt;bind&lt;/code&gt;, since &lt;code&gt;then&lt;/code&gt; is essentially a helper function you could write yourself.&lt;/p&gt;

&lt;h4&gt;The Maybe Monad - Clojure edition&lt;/h4&gt;

&lt;p&gt;With definitions out of the way, let&amp;#8217;s implement the Clojure version of the Maybe monad.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;maybe-monad&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;mv&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nv"&gt;mv&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;mv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))})&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Yup. That&amp;#8217;s &lt;em&gt;it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For the maybe monad, all its context needs to represent is a single value or the absence of value. We do this inside &lt;code&gt;bind&lt;/code&gt; by checking if the monadic value &lt;code&gt;mv&lt;/code&gt; is &lt;code&gt;nil&lt;/code&gt;. If it isn&amp;#8217;t, we apply &lt;code&gt;f&lt;/code&gt; to it, which will yield another monadic value. If, on the other hand, &lt;code&gt;mv&lt;/code&gt; IS &lt;code&gt;nil&lt;/code&gt;, we just return &lt;code&gt;nil&lt;/code&gt;, bypassing the function application entirely.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;return&lt;/code&gt;, as we saw, wraps a value into a minimal monad. In this case this is the value itself, so we just return it untouched.&lt;/p&gt;

&lt;p&gt;This is how one may go about using it:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;another-order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;           &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                  &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                     &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:return&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="nv"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;))))))))))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; nil&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;em&gt;WOW!&lt;/em&gt; That is awful! And I won&amp;#8217;t blame you for not wanting to read through this aberration. But trust me, it does the job.&lt;/p&gt;

&lt;p&gt;However, you&amp;#8217;re probably thinking: that looks &lt;em&gt;nothing&lt;/em&gt; like the nice little &lt;code&gt;domonad&lt;/code&gt; notation we saw earlier!&lt;/p&gt;

&lt;p&gt;Well, you&amp;#8217;re right. That&amp;#8217;s because &lt;code&gt;domonad&lt;/code&gt; is a &lt;a href="http://clojure.org/macros"&gt;macro&lt;/a&gt; - it gives us some syntactic sugar that expands into the real code shown above. In order to be able to use the &lt;code&gt;domonad&lt;/code&gt; notation, paste the following into your REPL:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;monad-steps&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;monad&lt;/span&gt; &lt;span class="nv"&gt;steps&lt;/span&gt; &lt;span class="nv"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;seq &lt;/span&gt;&lt;span class="nv"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;first &lt;/span&gt;&lt;span class="nv"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                  &lt;span class="nv"&gt;snd&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;second &lt;/span&gt;&lt;span class="nv"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                  &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;~monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;symbol &lt;/span&gt;&lt;span class="nv"&gt;fst&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt; &lt;span class="nv"&gt;~snd&lt;/span&gt; &lt;span class="nv"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;monad-steps&lt;/span&gt; &lt;span class="nv"&gt;monad&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;subvec &lt;/span&gt;&lt;span class="nv"&gt;steps&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="nv"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defmacro &lt;/span&gt;&lt;span class="nv"&gt;domonad&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;monad&lt;/span&gt; &lt;span class="nv"&gt;steps&lt;/span&gt; &lt;span class="nv"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;first&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;partition&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nv"&gt;forms&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;second&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;partition&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nv"&gt;new-steps&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;subvec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;vec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interleave &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cons &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt; &lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;forms&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&gt;&lt;span class='line'&gt;          &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;m&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="nv"&gt;~monad&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;second &lt;/span&gt;&lt;span class="nv"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nv"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;monad-steps&lt;/span&gt; &lt;span class="nv"&gt;monad&lt;/span&gt; &lt;span class="nv"&gt;new-steps&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;~monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;symbol &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;last &lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:return&lt;/span&gt; &lt;span class="nv"&gt;~monad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;~expr&lt;/span&gt;&lt;span class="p"&gt;))))))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;All set! Now you should be able to run the examples that use &lt;code&gt;domonad&lt;/code&gt; without any hiccups. Give it a shot:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;domonad&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt; &lt;span class="nv"&gt;another-order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculate-shipping-rate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:address&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;discount&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lookup-discount-code&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:discount-code&lt;/span&gt; &lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-shipping-costs&lt;/span&gt; &lt;span class="nv"&gt;shipping-rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply-discount-code&lt;/span&gt; &lt;span class="nv"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; nil&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; macros can be daunting at times so don&amp;#8217;t worry too much about its implementation. It&amp;#8217;s way more important to me that you understand the end result than it is to be able to implement the macro yourself - but by all means dissect this implementation if you feel inclined to do so :)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Now that&amp;#8217;s way better. The &lt;em&gt;maybe&lt;/em&gt; monad abstracted away the logic behind computations that can fail so you don&amp;#8217;t have to worry about it in your functions  - you can just focus on writing them.&lt;/p&gt;

&lt;p&gt;In the end I also believe it aids readability once you get used to it.&lt;/p&gt;

&lt;h3&gt;Don&amp;#8217;t break the law&lt;/h3&gt;

&lt;p&gt;Monads have laws of their own too! Let&amp;#8217;s have a look at them.&lt;/p&gt;

&lt;h4&gt;Right unit&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Binding a monadic value &lt;code&gt;m&lt;/code&gt; to &lt;code&gt;return&lt;/code&gt; should be equal to &lt;code&gt;m&lt;/code&gt; itself&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell speak:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;m&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The proof in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:return&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="nv"&gt;return&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 10&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;is the same as&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="c1"&gt;;; 10&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Left unit&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Applying &lt;code&gt;return&lt;/code&gt; to &lt;code&gt;x&lt;/code&gt; and then applying &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt; to the resulting value and &lt;code&gt;f&lt;/code&gt;should be the same as applying &lt;code&gt;f&lt;/code&gt; directly to &lt;code&gt;x&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell speak:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The proof in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:return&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; 20&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;is the same as&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 20&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Associativity&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Binding &lt;code&gt;m&lt;/code&gt; to &lt;code&gt;f&lt;/code&gt; and then applying &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt; to the result and &lt;code&gt;g&lt;/code&gt; should be the same as applying &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt; to &lt;code&gt;m&lt;/code&gt; and a function of argument &lt;code&gt;x&lt;/code&gt; that first applies &lt;code&gt;f&lt;/code&gt; to &lt;code&gt;x&lt;/code&gt; and then binds it to &lt;code&gt;g&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Phew&amp;#8230;another mouthful, huh? Code should make it clearer. As usual, Haskell comes first:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;&amp;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="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;  &lt;span class="ow"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And now let&amp;#8217;s prove it in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:bind&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:return&lt;/span&gt; &lt;span class="nv"&gt;maybe-monad&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; 30&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;is the same as&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;m&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;;; 30&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Alright, we&amp;#8217;re getting to the end now! Hold on just a little longer!&lt;/p&gt;

&lt;h3&gt;One last thing - The List Monad&lt;/h3&gt;

&lt;p&gt;Yeah, I&amp;#8217;m sure you saw this coming. Lists are monads too! I&amp;#8217;ll make this quick and show its implementation and usage in Clojure - bear with me one last time.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;list-monad&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;mv&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nb"&gt;seq &lt;/span&gt;&lt;span class="nv"&gt;mv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;concat&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;mv&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;[]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;let&amp;#39;s play with it&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;domonad&lt;/span&gt; &lt;span class="nv"&gt;list-monad&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;- &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; (3 -3 6 -6)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;domonad&lt;/span&gt; &lt;span class="nv"&gt;list-monad&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; () - an empty list. &lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This should look familiar if you&amp;#8217;ve used &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/for"&gt;list comprehensions&lt;/a&gt; in Clojure or other languages such as Python:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;- &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; (3 -3 6 -6)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;See? You&amp;#8217;ve been using monads all along and didn&amp;#8217;t even know it! How awesome is that?&lt;/p&gt;

&lt;p&gt;Also note that we didn&amp;#8217;t need to re-implement &lt;code&gt;domonad&lt;/code&gt; for the list monad. It&amp;#8217;s a generic macro that will work with any monads you throw at it!&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s interesting to see how the list and the maybe monads differ. This time, &lt;code&gt;return&lt;/code&gt; puts the value &lt;code&gt;v&lt;/code&gt; inside a list and returns it because for lists, a minimum monad is a list with a single element.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bind&lt;/code&gt; is a bit more interesting. It first checks to see if &lt;code&gt;mv&lt;/code&gt; is empty, in which case it returns an empty list, causing the whole computation to stop. If, however, &lt;code&gt;mv&lt;/code&gt; is NOT empty, it maps &lt;code&gt;f&lt;/code&gt; over every element in &lt;code&gt;mv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The resulting list is potentially a list of lists, since functions fed to monads - such as &lt;code&gt;f&lt;/code&gt; in this case - have to return monadic values. That&amp;#8217;s why we then apply &lt;code&gt;concat&lt;/code&gt; to the resulting list, effectively flattening it.&lt;/p&gt;

&lt;h3&gt;Final words&lt;/h3&gt;

&lt;p&gt;Hopefully you now have a much better understanding of Monads and should start seeing in your code use cases and/or opportunities for the monads shown here.&lt;/p&gt;

&lt;p&gt;You&amp;#8217;ll notice that this Clojure implementation of monads used only normal functions - that was by design since I wanted this implementation to be as close as possible to Clojure&amp;#8217;s &lt;a href="https://github.com/clojure/algo.monads"&gt;core.algo.monads&lt;/a&gt; library. You should have a look at it.&lt;/p&gt;

&lt;p&gt;Also, bear in mind that this tutorial is by no means exhaustive - there&amp;#8217;s &lt;strong&gt;a lot&lt;/strong&gt; more about monads that I could possibly cover in a blog - it was hard enough ending it here! But if you want to study more about them, I&amp;#8217;d recommend starting with these resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://learnyouahaskell.com/"&gt;Learn You a Haskell for Great Good&lt;/a&gt; - this book is an excellent intro to Haskell and it was the approach found there that made me grok monads - highly recommended and freely available online.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://en.wikibooks.org/wiki/Haskell/Understanding_monads"&gt;The Monads Section on the Haskell wikibook&lt;/a&gt; - another free online resource&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That&amp;#8217;s it from me. I hope you enjoyed the read and if you made it until here, a big &lt;em&gt;thank you&lt;/em&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/e2d4JDHipLk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Monads in small bites - Part III - Monoids]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/8BSwBLD9_ZU/" />
    <updated>2012-12-05T09:25:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids</id>
    <content type="html">&lt;p&gt;This is Part III of my Monads tutorial. Make sure you read the previous parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I   - Functors&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Part II  - Applicative Functors&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Part III - Monoids (this post)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads/"&gt;Part IV  - Monads&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Monoids&lt;/h3&gt;

&lt;p&gt;Simply put, Monoids describe types containing a &lt;a href="http://en.wikipedia.org/wiki/Binary_function"&gt;binary function&lt;/a&gt; and an identity value.&lt;/p&gt;

&lt;p&gt;When applied to the identity value and a random value &lt;code&gt;x&lt;/code&gt;, said function leaves its argument &lt;code&gt;x&lt;/code&gt; &lt;em&gt;untouched&lt;/em&gt;, returning it as a result.&lt;/p&gt;

&lt;p&gt;This short description should be enough to get the conversation started.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how Haskell defines a Monoid:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Monoid&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;mempty&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;mappend&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;mconcat&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;mconcat&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;foldr&lt;/span&gt; &lt;span class="n"&gt;mappend&lt;/span&gt; &lt;span class="n"&gt;mempty&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This type introduces three new functions so let&amp;#8217;s walk through each one of them:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;mempty&lt;/strong&gt; - I started with a lie since &lt;code&gt;mempty&lt;/code&gt; isn&amp;#8217;t actually a function. You can think of it as a constant of the same type of the Monoid &lt;code&gt;m&lt;/code&gt;. It is this monoid&amp;#8217;s identity value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mappend&lt;/strong&gt; - A poorly named function, &lt;code&gt;mappend&lt;/code&gt; is the binary function I mentioned earlier. It receives two arguments of type &lt;code&gt;m&lt;/code&gt; and returns a value of type &lt;code&gt;m&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mconcat&lt;/strong&gt; - It receives a list of Monoids &lt;code&gt;m&lt;/code&gt; and reduces them to a single Monoid of type &lt;code&gt;m&lt;/code&gt;. What&amp;#8217;s interesting about this snippet is that the Monoid type class provides a default implementation for &lt;code&gt;mconcat&lt;/code&gt;: it simply calls &lt;em&gt;&lt;a href="http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl" title=""&gt;foldr&lt;/a&gt;&lt;/em&gt; with the binary function &lt;code&gt;mappend&lt;/code&gt;, a starting value of &lt;code&gt;mempty&lt;/code&gt; and the list of Monoid values &lt;code&gt;ms&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Enough Haskell! Let&amp;#8217;s have a look at a few examples.&lt;/p&gt;

&lt;p&gt;Did you know that, in Clojure,  the functions &lt;code&gt;*&lt;/code&gt; and &lt;code&gt;+&lt;/code&gt; are monoids? Yup. But don&amp;#8217;t take my word for it. Let me prove it to you:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt; &lt;span class="nv"&gt;mempty&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;+&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; 0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt; &lt;span class="nv"&gt;mappend&lt;/span&gt; &lt;span class="nv"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;mconcat&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reduce &lt;/span&gt;&lt;span class="nv"&gt;mappend&lt;/span&gt; &lt;span class="nv"&gt;mempty&lt;/span&gt; &lt;span class="nv"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mappend&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 7&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mconcat&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;;; 9&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Whoa!  What happened here? Am I just making this stuff up?&lt;/p&gt;

&lt;p&gt;Not really. I only defined the same haskell names to their Clojure counterparts for clarity. Totally overkill. The code above is the same as:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 7&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reduce &lt;/span&gt;&lt;span class="nv"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;;; 9&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Did you notice that on the second call to &lt;code&gt;reduce&lt;/code&gt; we did not provide an initial value? That&amp;#8217;s because &lt;code&gt;reduce&lt;/code&gt; will attempt to get its initial accumulator by calling the reducing function without arguments - hence &lt;code&gt;mempty == (+)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So that means we don&amp;#8217;t even need an &lt;code&gt;mconcat&lt;/code&gt; function since in Clojure,  &lt;code&gt;reduce&lt;/code&gt; works with monoids as well!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: this isn&amp;#8217;t entirely true. When I wrote this post I had in mind the version of &lt;code&gt;reduce&lt;/code&gt; provided by the Clojure (1.5+) reducers library. The &lt;a href="https://github.com/clojure/clojure/blob/master/src/clj/clojure/core/reducers.clj#L71"&gt;source code&lt;/a&gt; shows how that is the case.&lt;/p&gt;

&lt;p&gt;The implementation of &lt;code&gt;reduce&lt;/code&gt; in &lt;code&gt;clojure.core&lt;/code&gt; however uses the first element of the collection being reduced over as its seed.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;But how the hell do you create a monoid in Clojure then? I&amp;#8217;m glad you asked. Let&amp;#8217;s create our own &lt;em&gt;plus-monoid&lt;/em&gt;!&lt;/p&gt;

&lt;h4&gt;Your first monoid&lt;/h4&gt;

&lt;p&gt;In &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I&lt;/a&gt; I implemented Functors using &lt;a href="http://clojure.org/protocols"&gt;protocols&lt;/a&gt; and &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/defrecord"&gt;records&lt;/a&gt;. In &lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Part II&lt;/a&gt; I showed how Applicative Functors could be implemented using &lt;a href="http://clojure.org/multimethods"&gt;multimethods&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This time around I won&amp;#8217;t be using any of these. I&amp;#8217;ll implement Monoids using pure functions:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;plus-monoid&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;([]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 0 - same as mempty&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 7 - same as mappend&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reduce &lt;/span&gt;&lt;span class="nv"&gt;plus-monoid&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;;; 9 - when working with monoids, reduce is the same as mconcat&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;We start by defining a function with multiple arities. The first body receives no arguments, so we just return the identity value for summation, which is &lt;em&gt;0 (zero)&lt;/em&gt;. The second body receives two arguments so we can just add them up. Multiplication can be implemented in a similar fashion but obviously with the identity value of &lt;em&gt;one&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Easy, huh?&lt;/p&gt;

&lt;p&gt;Oh, by the way, lists are Monoids too! Who&amp;#8217;d have thought?&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s its Clojure implementation:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;list-monoid&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;([]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;concat &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; () - remember, same as mempty&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&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;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;;; (1 2 3 4 5 6) - remember, same as mappend&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reduce &lt;/span&gt;&lt;span class="nv"&gt;list-monoid&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&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;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt; &lt;span class="c1"&gt;;; (1 2 3 4 5 6 7 8 9) - mconcat in action&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Same rules apply but for lists &lt;code&gt;mappend&lt;/code&gt; is achieved by using &lt;code&gt;concat&lt;/code&gt; inside our monoid function.&lt;/p&gt;

&lt;p&gt;Also, since our binary function concatenates two lists together it makes sense that &lt;code&gt;mempty&lt;/code&gt; is &lt;code&gt;()&lt;/code&gt; (the empty list). Remember &lt;code&gt;mempty&lt;/code&gt; is supposed to be an identity value so if we stitch &lt;code&gt;()&lt;/code&gt; and &lt;code&gt;[1 2 3]&lt;/code&gt; together, we&amp;#8217;re left with &lt;code&gt;[1 2 3]&lt;/code&gt; which is exactly what we&amp;#8217;d expect.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;You can see now why I said &lt;code&gt;mappend&lt;/code&gt; was poorly named. While it makes sense when you think about lists, &lt;code&gt;mappend&lt;/code&gt; doesn&amp;#8217;t do any appending in our &lt;em&gt;plus-monoid&lt;/em&gt; and in fact most monoids don&amp;#8217;t append anything. Just keep this in mind if you see any haskell code using it: &lt;code&gt;mappend&lt;/code&gt; is just a binary function.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;Don&amp;#8217;t break the law&lt;/h3&gt;

&lt;p&gt;You saw this coming, huh? Monoids also come with a couple of laws. You know the drill. Let&amp;#8217;s prove they both hold.&lt;/p&gt;

&lt;h4&gt;Identity&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Applying &lt;code&gt;mappend&lt;/code&gt; to &lt;code&gt;mempty&lt;/code&gt; and a monoid &lt;code&gt;x&lt;/code&gt; should be the same as the original &lt;code&gt;x&lt;/code&gt; monoid.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;mappend&lt;/span&gt; &lt;span class="n"&gt;mempty&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;mappend&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;mempty&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;And the proof in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; first, the plus-monoid&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;mempty&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; This...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="nv"&gt;mempty&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 10&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;mempty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 10&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;now, the list-monoid&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;mempty&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; This...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="nv"&gt;mempty&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; (1 2 3)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;mempty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; (1 2 3)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Associativity&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Applying &lt;code&gt;mappend&lt;/code&gt; to a monoid &lt;code&gt;x&lt;/code&gt; and the result of applying &lt;code&gt;mappend&lt;/code&gt; to the monoids &lt;code&gt;y&lt;/code&gt; and &lt;code&gt;z&lt;/code&gt; should be the same as first applying &lt;code&gt;mappend&lt;/code&gt; to the monoids &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; and then applying &lt;code&gt;mappend&lt;/code&gt; to the resulting monoid and the monoid &lt;code&gt;z&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;mappend&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mappend&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mappend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mappend&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And the proof in Clojure - remember that calling the monoid function with two arguments is equivalent to &lt;code&gt;mappend&lt;/code&gt; in haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; first, the plus-monoid&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; This...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; 75&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plus-monoid&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 75&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;now, the list-monoid&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; This...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; (40 10 25 50)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list-monoid&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; (40 10 25 50)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Almost there&amp;#8230;&lt;/h3&gt;

&lt;p&gt;This puts an end to Part III. It&amp;#8217;s time to head to the pub.&lt;/p&gt;

&lt;p&gt;When you&amp;#8217;re back look for the final post in these series - &lt;a href="http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads/"&gt;Part IV&lt;/a&gt; - where we will conclude our journey by finally introducing Monads!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/8BSwBLD9_ZU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Monads in small bites - Part II - Applicative Functors]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/q6wy49yBcGU/" />
    <updated>2012-12-02T21:43:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors</id>
    <content type="html">&lt;p&gt;This is Part II of my Monads tutorial. Make sure you read the previous parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I   - Functors&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Part II  - Applicative Functors (this post)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/"&gt;Part III - Monoids&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads/"&gt;Part IV  - Monads&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Applicative Functors&lt;/h3&gt;

&lt;p&gt;In &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I&lt;/a&gt; I talked a little about Haskell type signatures and introduced Functors, which provide a way to map standard functions over values which are &lt;em&gt;wrapped&lt;/em&gt; inside a Functor - we used &lt;code&gt;fmap&lt;/code&gt; for that. You might want to &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;skim through it&lt;/a&gt; again as a refresher.&lt;/p&gt;

&lt;p&gt;Now suppose you have Functors that &lt;em&gt;wrap&lt;/em&gt; functions and that you want to apply those &lt;em&gt;wrapped&lt;/em&gt; functions to other Functors, maybe even composing new functions on the way!&lt;/p&gt;

&lt;p&gt;What then?&lt;/p&gt;

&lt;p&gt;Well you&amp;#8217;re in luck! Applicative Functors do just that! They&amp;#8217;re &lt;strong&gt;Functors on steroids&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how Haskell defines the Applicative data type:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Applicative&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Based on our previous knowledge of Haskell&amp;#8217;s type signatures, we can infer from this definition that in order for it to be an Applicative Functor, &lt;code&gt;f&lt;/code&gt; &lt;em&gt;must&lt;/em&gt; already be a Functor.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s break this down and have a closer look at the two new functions this type introduces:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;pure&lt;/strong&gt; is a function that takes a value &lt;code&gt;a&lt;/code&gt; and &lt;em&gt;wraps&lt;/em&gt; it into a minimal Functor &lt;code&gt;f&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&amp;lt;*&gt;&lt;/strong&gt; is a function that takes two arguments: the first is a Functor &lt;code&gt;f&lt;/code&gt; that wraps a function of type &lt;code&gt;a -&amp;gt; b&lt;/code&gt;. The second argument is a Functor &lt;code&gt;f&lt;/code&gt; that wraps a value - which could be a function! - of type &lt;code&gt;a&lt;/code&gt;. The final result is a Functor &lt;code&gt;f&lt;/code&gt; that wraps some value of type &lt;code&gt;b&lt;/code&gt; - which was obtained by somehow applying the function &lt;code&gt;(a -&amp;gt; b)&lt;/code&gt; to the Functor &lt;code&gt;f a&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;pure&lt;/code&gt; has a straightforward explanation whereas &lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt; is a bit more involved.&lt;/p&gt;

&lt;p&gt;To clear things up, I&amp;#8217;ll show the type signatures again but this time as if they only worked with the List Functor that we&amp;#8217;ve been working on:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&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&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="ow"&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="ow"&gt;-&amp;gt;&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&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s revisit those definitions:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;pure&lt;/strong&gt; is a function that takes a value &lt;code&gt;a&lt;/code&gt; and &lt;em&gt;puts&lt;/em&gt; it into an empty list, returning the resulting single element list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&amp;lt;*&gt;&lt;/strong&gt; is a function that takes two arguments: the first is a list containing one or more functions of type &lt;code&gt;a -&amp;gt; b&lt;/code&gt;. The second argument is a list of one or more values - or functions! - of type &lt;code&gt;a&lt;/code&gt;. The final result is a list of one or more values of type &lt;code&gt;b&lt;/code&gt; - which was obtained by somehow applying the function &lt;code&gt;(a -&amp;gt; b)&lt;/code&gt; to the Functor &lt;code&gt;f a&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Enough definitions though! Let&amp;#8217;s extend our List Functor and make it an Applicative as well.&lt;/p&gt;

&lt;p&gt;While we&amp;#8217;ll still be using the List Functor we implemented in &lt;a href="http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/"&gt;Part I&lt;/a&gt;, this time I&amp;#8217;ll implement its Applicative version using &lt;a href="http://clojure.org/multimethods"&gt;multimethods&lt;/a&gt; for a change.  Here&amp;#8217;s the code:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; it dispatches on the record type since we could have implementations of pure for List, Maybe, Either etc...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defmulti &lt;/span&gt;&lt;span class="nv"&gt;pure&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defmethod &lt;/span&gt;&lt;span class="nv"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s"&gt;&amp;quot;Wraps value v in a list&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; it dispatches on the class of the Functor instance passed in the 1st argument&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defmulti &lt;/span&gt;&lt;span class="nv"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;fs&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;class &lt;/span&gt;&lt;span class="nv"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defmethod &lt;/span&gt;&lt;span class="nv"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;fs&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s"&gt;&amp;quot;Unwraps the functions in fs, applies them to the Functors in xs, wrapping the result at the end&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:wrapped&lt;/span&gt; &lt;span class="nv"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                 &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:wrapped&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;By focusing on the List as an Applicative Functor we can more easily understand what these functions do. From the code above, &lt;code&gt;pure&lt;/code&gt;&amp;#8217;s job is a simple one: all it does is &lt;em&gt;wrap&lt;/em&gt; it&amp;#8217;s argument &lt;code&gt;v&lt;/code&gt; into a minimal List functor which in our case means a Functor wrapping a one element list.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt; on the other hand is responsible for somehow unwrapping the functions brought in by the Applicatives in &lt;code&gt;fs&lt;/code&gt; and applying them to the [Applicative] Functors in &lt;code&gt;xs&lt;/code&gt;. It does that by using &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/for"&gt;list comprehensions&lt;/a&gt; and &lt;em&gt;wraps&lt;/em&gt; the result into a new List Functor.&lt;/p&gt;

&lt;p&gt;Study this code carefully. It &lt;em&gt;can&lt;/em&gt; be tricky.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: When I first encountered &lt;strong&gt;&amp;lt;*&gt;&lt;/strong&gt; I had no idea what this function was called. I asked the twittersphere and it seems it&amp;#8217;s called &lt;code&gt;apply&lt;/code&gt;. In the process of figuring this out I was enlightened &lt;a href="https://twitter.com/leonardo_borges/status/267777875367841792"&gt;by this conversation&lt;/a&gt;. It turns out &lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt; has several names. Can you guess which one is my favorite? :)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;With the Applicative functions defined for our List, let&amp;#8217;s take it for a spin:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;fs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&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;span class="nv"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&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;span class="nv"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;xs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;fs&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (2 4 6 11 12 13)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (50 100 150)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;There should have been no surprises here. Read the code again and make sure it&amp;#8217;s all fresh before moving along.&lt;/p&gt;

&lt;h3&gt;Don&amp;#8217;t break the law&lt;/h3&gt;

&lt;p&gt;Just as Functors, Applicative Functors also need to obey some laws:&lt;/p&gt;

&lt;h4&gt;Identity&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Feeding a function &lt;code&gt;f&lt;/code&gt; to &lt;code&gt;pure&lt;/code&gt; and applying the resulting Applicative to the Functor &lt;code&gt;v&lt;/code&gt; should be the same as directly mapping &lt;code&gt;f&lt;/code&gt; over the Functor &lt;code&gt;v&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell speak:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fmap&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And this is the proof, in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (12)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (12)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Composition&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;The result of &lt;em&gt;applying&lt;/em&gt; an Applicative Functor that yields the &lt;strong&gt;function composition&lt;/strong&gt; operator to the Applicative &lt;code&gt;u&lt;/code&gt;, then apply the resulting Functor to &lt;code&gt;v&lt;/code&gt; and finally applying that result to the final Applicative &lt;code&gt;w&lt;/code&gt; should be the same as &lt;em&gt;applying&lt;/em&gt; &lt;code&gt;v&lt;/code&gt; to &lt;code&gt;w&lt;/code&gt; and then &lt;em&gt;applying&lt;/em&gt; &lt;code&gt;u&lt;/code&gt; to the resulting &lt;em&gt;Applicative&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;That was a mouthful! Let&amp;#8217;s see how Haskell tells this story:&lt;/p&gt;

&lt;p&gt;In Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;pure&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;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I needed to cheat a bit in Clojure to prove this law since functions are not &lt;a href="http://www.haskell.org/haskellwiki/Currying"&gt;curried by default like they are in Haskell&lt;/a&gt;. But this code should still clearly show how this law holds:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;u&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&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;span class="nv"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&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;span class="nv"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;w&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; Given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;partial &lt;/span&gt;&lt;span class="nv"&gt;comp&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;w&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (22 24 26)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;u&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt; &lt;span class="nv"&gt;w&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (22 24 26)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Homomorphism&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;The result of applying the &lt;code&gt;pure&lt;/code&gt; value of &lt;code&gt;f&lt;/code&gt; to the &lt;code&gt;pure&lt;/code&gt; value of &lt;code&gt;x&lt;/code&gt; should be the same as applying &lt;code&gt;f&lt;/code&gt; directly to &lt;code&gt;x&lt;/code&gt; and then feeding that into &lt;code&gt;pure&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (20)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (20)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Interchange&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;The result of applying an Applicative Functor &lt;code&gt;u&lt;/code&gt; to the &lt;code&gt;pure&lt;/code&gt; value of &lt;code&gt;y&lt;/code&gt; should be the same as taking the Applicative obtained by calling &lt;code&gt;pure&lt;/code&gt; with a function that applies its argument to &lt;code&gt;y&lt;/code&gt; and then applying that to &lt;code&gt;u&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;u&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This type signature presents new syntax so before proving the law in Clojure, I want to explain what &lt;code&gt;($ y)&lt;/code&gt; means.&lt;/p&gt;

&lt;p&gt;In Haskell, &lt;code&gt;$&lt;/code&gt; is the function application operator. So if we give &lt;code&gt;y&lt;/code&gt; a value of &lt;em&gt;10&lt;/em&gt;, I can show you that in this law &lt;code&gt;$&lt;/code&gt; essentially translates to a single argument function that applies its argument to &lt;em&gt;10&lt;/em&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;-- helper function. it doubles its argument&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;-- given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- 20&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;-- ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;dollarTen&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&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="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;-- this is Haskell&amp;#39;s lambda syntax. It&amp;#39;s equivalent to ($ 10)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;dollarTen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- 20&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, to the proof in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;u&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;u&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (60)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; ...is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;dollar-y&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; it&amp;#39;s called dollar-y to show the correlation with the explanation above&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;*&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pure&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="nv"&gt;dollar-y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (60)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This brings us to the end or Part II. Two down and two to go.&lt;/p&gt;

&lt;p&gt;I hope you&amp;#8217;re still with me but go home now.&lt;/p&gt;

&lt;p&gt;Or better yet go to the gym lift some weights and think about these Functors on steroids. When you&amp;#8217;re back, look out for &lt;a href="http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/"&gt;Part III&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/q6wy49yBcGU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Monads in small bites - Part I - Functors]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/SMnlobm-gaM/" />
    <updated>2012-11-30T01:06:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors</id>
    <content type="html">&lt;p&gt;Today I join the already bloated group of people who wrote monad tutorials. It&amp;#8217;s a bit of a ritual, really.&lt;/p&gt;

&lt;p&gt;Different than most tutorials though I aim to take a different approach. The good news is that I won&amp;#8217;t be comparing monads to burritos :)&lt;/p&gt;

&lt;p&gt;People say one needs to have his/her own epiphany in order to understand Monads and reading explanations from others is of little help. My goal is to disprove that.&lt;/p&gt;

&lt;p&gt;To that end, this tutorial will be split in four parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Part I   - Functors (this post)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Part II  - Applicative Functors&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/05/monads-in-small-bites-part-iii-monoids/"&gt;Part III - Monoids&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2012/12/08/monads-in-small-bites-part-iv-monads/"&gt;Part IV  - Monads&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You might want to bookmark this page - once the other parts are up, I&amp;#8217;ll update the list above with the links to them.&lt;/p&gt;

&lt;h3&gt;Before we start&lt;/h3&gt;

&lt;p&gt;I know what you&amp;#8217;re thinking: Do I really need to know Applicative Functors just to grasp Monads?&lt;/p&gt;

&lt;p&gt;Well, no. However, I found that gradually building your knowledge from Parts I, II and III will allow you to fully grasp monads without the need for burritos or elephants.&lt;/p&gt;

&lt;p&gt;You should also be familiar with a functional programming language. Any language should be fine but you&amp;#8217;ll get the most out of this tutorial if you&amp;#8217;re familiar with Haskell and/or Clojure.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re not familiar with Clojure, fear not - Clojure is a small language and the code snippets should still make sense if you put your mind to it - they&amp;#8217;re all short and sweet. I also encourage you to re-implement the examples in your language of choice to gain a deeper understanding on the subject.&lt;/p&gt;

&lt;p&gt;Ready then? Let&amp;#8217;s dive in.&lt;/p&gt;

&lt;h2&gt;Just enough Haskell&lt;/h2&gt;

&lt;p&gt;This is not a Haskell tutorial but trust me when I tell you that learning just enough about its type signatures will make all the difference in the world in understanding the concepts I&amp;#8217;m about to present.&lt;/p&gt;

&lt;p&gt;Although I&amp;#8217;ll be using a little bit of Haskell syntax, I&amp;#8217;ll also provide implementations in Clojure. They are in order so you should be able to paste all code sample in the REPL and follow along if you wish.&lt;/p&gt;

&lt;h3&gt;Type signatures&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;ll make this quick. Say you have a function called &lt;code&gt;mk-vec&lt;/code&gt; that creates a 2D vector with &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; coordinates. Such function could easily be coded in Clojure like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;mk-vec&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:x&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;:y&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; using it&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;my-vec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mk-vec&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:x&lt;/span&gt; &lt;span class="nv"&gt;my-vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; 10&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, this function takes two arguments - x and y - and returns a map - or hash if you come from Ruby - that wraps those values in it, providing an easy way to retrieve them.&lt;/p&gt;

&lt;p&gt;Now if this function had been implemented in haskell this would be its type signature - read the comments:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;Data.Map&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt; &lt;span class="c1"&gt;-- just giving Data.Map an alias&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;mkVec&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="c1"&gt;-- this is the type signature&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;mkVec&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;y&amp;quot;&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;span class="c1"&gt;-- this is the implementation. You can ignore this part.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;-- using it&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;myVec&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mkVec&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lookup&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;myVec&lt;/span&gt; &lt;span class="c1"&gt;-- Just 10 &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;-- ignore the actual value that is returned. Read it as 10 for now.&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Whatever comes after the &lt;code&gt;::&lt;/code&gt; is part of the function type signature. Read it like this:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This is a function that receives two arguments of type &lt;code&gt;a&lt;/code&gt; - which means any type - and returns a Map of key/value pairs where the key is of type &lt;code&gt;[Char]&lt;/code&gt; - technically a list of &lt;code&gt;Char&lt;/code&gt; values but for all effects and purposes just read it as &lt;code&gt;String&lt;/code&gt; - and the value is of type &lt;code&gt;a&lt;/code&gt; - the same type as its arguments.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;It might help to see the type signature in this light:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;mkVec&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Char&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&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It highlights the return value in parenthesis.&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s have a look at a built in function, &lt;code&gt;*&lt;/code&gt;. As you know, it performs multiplication and this is its type signature:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&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="ow"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Num&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Can you guess now what it means? I&amp;#8217;m sure you can. There&amp;#8217;s one small difference though: this function has a type constraint - it&amp;#8217;s that &lt;strong&gt;Num a =&gt; &amp;#8230;&lt;/strong&gt; part of the signature. Read it like this:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This is a function that receives two arguments of type &lt;code&gt;a&lt;/code&gt; and returns a value of the same type, as long as the type of &lt;code&gt;a&lt;/code&gt; is an instance of &lt;code&gt;Num&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And that&amp;#8217;s it for now. Read it again to make sure it&amp;#8217;s fresh in your mind and then continue.&lt;/p&gt;

&lt;p&gt;As we encounter more type signatures, I&amp;#8217;ll walk you through each one of them - but if you got it up until now, you&amp;#8217;ll easily grasp the other type signatures.&lt;/p&gt;

&lt;h3&gt;Functors&lt;/h3&gt;

&lt;p&gt;In a nutshell Functors are things that can be mapped over.&lt;/p&gt;

&lt;p&gt;Haskell defines Functors like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fmap&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s dissect that type signature:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;fmap&lt;/strong&gt; is a function that receives two arguments: the first is a function that receives an argument of type &lt;code&gt;a&lt;/code&gt; and returns a value of type &lt;code&gt;b&lt;/code&gt; and the second is a Functor that contains a value of type &lt;code&gt;a&lt;/code&gt; - represented by &lt;code&gt;f a&lt;/code&gt;. The result of calling &lt;code&gt;fmap&lt;/code&gt; is a Functor of same type - &lt;code&gt;f&lt;/code&gt; - containing a value of type &lt;strong&gt;b&lt;/strong&gt;, which is the result of applying the function to &lt;strong&gt;a&lt;/strong&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Too much? Let&amp;#8217;s have a look at an example: the &lt;strong&gt;List&lt;/strong&gt; Functor.&lt;/p&gt;

&lt;p&gt;If we rewrite the &lt;code&gt;fmap&lt;/code&gt; type signature as if it only worked on lists, this is what we&amp;#8217;d come up with:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fmap&lt;/span&gt; &lt;span class="ow"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&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="ow"&gt;-&amp;gt;&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&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This new type signature allows us to rewrite that last definition:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;fmap&lt;/strong&gt; is a function that receives two arguments: the first is a function that receives an argument of type &lt;code&gt;a&lt;/code&gt; and returns a value of type &lt;code&gt;b&lt;/code&gt; and the second is a List of zero or more values of type &lt;strong&gt;a&lt;/strong&gt;. The result of calling &lt;code&gt;fmap&lt;/code&gt; is a List of zero or more values of type &lt;strong&gt;b&lt;/strong&gt;, each of which is the result of applying the function to each &lt;code&gt;a&lt;/code&gt; element.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Does this sound familiar to you? It should, because this is essentially what the &lt;code&gt;map&lt;/code&gt; function available in most functional-&lt;em&gt;ish&lt;/em&gt; languages does! It takes a function and a list, applies the function to every element in the list while putting the results into a new list, finally returning it.&lt;/p&gt;

&lt;p&gt;In fact, the &lt;code&gt;fmap&lt;/code&gt; implementation of the List Functor from Haskell is implemented in terms of &lt;code&gt;map&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s see how that could be done in Clojure. I&amp;#8217;ll use &lt;a href="http://clojure.org/protocols"&gt;protocols&lt;/a&gt; and &lt;a href="http://clojure.org/datatypes"&gt;records&lt;/a&gt; but they are not strictly required for this.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s our Functor protocol:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defprotocol&lt;/span&gt; &lt;span class="nv"&gt;Functor&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;functor&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Maps fn over the functor f&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And now our List Functor:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defrecord&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;wrapped&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;Functor&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;functor&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:wrapped&lt;/span&gt; &lt;span class="nv"&gt;functor&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In the snippet above all we&amp;#8217;re saying is that the List record must satisfy the Functor protocol, which makes sense. &lt;code&gt;fmap&lt;/code&gt; then is responsible for &lt;em&gt;unwrapping&lt;/em&gt; the value contained in the list functor and &lt;em&gt;mapping&lt;/em&gt; &lt;code&gt;f&lt;/code&gt; over it.&lt;/p&gt;

&lt;p&gt;Give it a go!&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;my-list-functor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (1 2 3)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="nv"&gt;my-list-functor&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (2 4 6)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;We can now &lt;code&gt;map&lt;/code&gt; arbitrary functions over the values &lt;code&gt;wrapped&lt;/code&gt; in a Functor! Awesome!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: In our Clojure version of the List Functor, it is implemented as a Record that wraps a primitive Clojure list/vector - &lt;code&gt;[]&lt;/code&gt;. As I mentioned this is not necessary but I chose to do it here to explicitly show the relationship with the Haskell types.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;Don&amp;#8217;t break the law&lt;/h3&gt;

&lt;p&gt;Now that we got a feel for what Functors are, it&amp;#8217;s worth noting that they must obey a few laws to be considered full-fledged Functors.&lt;/p&gt;

&lt;h4&gt;Identity&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Mapping an identity function over a Functor is the same as applying identity to the Functor itself&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This is how Haskell puts this law:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;functor&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;functor&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Translating that to Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;This...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="nv"&gt;my-list-functor&lt;/span&gt; &lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (1 2 3)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;identity &lt;/span&gt;&lt;span class="nv"&gt;my-list-functor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped [1 2 3]}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Composition&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;If you compose the functions &lt;code&gt;f&lt;/code&gt; and &lt;code&gt;g&lt;/code&gt; and map the resulting function over the Functor, that is the same as first mapping &lt;code&gt;g&lt;/code&gt; over the Functor and &lt;code&gt;then&lt;/code&gt; mapping &lt;code&gt;f&lt;/code&gt; over the resulting Functor.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;From the description you can see that this law involves &lt;a href="http://en.wikipedia.org/wiki/Function_composition"&gt;function composition&lt;/a&gt;. In Clojure, that&amp;#8217;s achieved with the &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/comp"&gt;comp&lt;/a&gt; function.&lt;/p&gt;

&lt;p&gt;Again, let&amp;#8217;s see how this law is defined in Haskell:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;functor&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fmap&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmap&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;functor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;.&lt;/code&gt; operator denotes function composition in Haskell&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And the proof in Clojure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; given the above, this...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="nv"&gt;my-list-functor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;comp &lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (12 14 16)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;; is the same as:&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;my-list-functor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fmap&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;; List{:wrapped (12 14 16)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: make sure you&amp;#8217;re familiar with &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/-%3E"&gt;Clojure&amp;#8217;s threading macro: &lt;strong&gt;-&gt;&lt;/strong&gt; &lt;/a&gt;. I&amp;#8217;ll be using it in most code snippets.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Nice! All laws hold so we can sleep peacefully in the knowledge that our Functor works as expected.&lt;/p&gt;

&lt;p&gt;Now go get a drink and stay tuned for &lt;a href="http://www.leonardoborges.com/writings/2012/12/02/monads-in-small-bites-part-ii-applicative-functors/"&gt;Part II&lt;/a&gt;, where I&amp;#8217;ll introduce &lt;em&gt;Applicative Functors&lt;/em&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/SMnlobm-gaM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[This is what we built in 24 hours]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/NeJhlDqxvXY/" />
    <updated>2012-11-05T11:12:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/11/05/this-is-was-we-built-in-24-hours</id>
    <content type="html">&lt;p&gt;Last week our current client - &lt;a href="http://ninemsn.com.au/"&gt;ninemsn&lt;/a&gt; - ran the 3rd edition of their HackDay.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s akin to Atlassian&amp;#8217;s &lt;a href="http://www.atlassian.com/shipit-day"&gt;ShipIt&lt;/a&gt; days so if you&amp;#8217;re not familiar with the concept, you should check their page but here&amp;#8217;s the gist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We&amp;#8217;re given 24 hours to work on whatever we like as long as it&amp;#8217;s related somehow to the business&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We&amp;#8217;re also free to use any technology we want&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The team consisted of &lt;a href="https://twitter.com/romainprieto"&gt;@romainprieto&lt;/a&gt;, Pranav Raja, &lt;a href="https://twitter.com/thepaddedcell"&gt;@thepaddedcell&lt;/a&gt;, &lt;a href="https://twitter.com/stewgleadow"&gt;@stewgleadow&lt;/a&gt; and myself (&lt;a href="https://twitter.com/leonardo_borges"&gt;@leonardo_borges&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;The idea: Cool story, bro!&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/romainprieto"&gt;@romainprieto&lt;/a&gt; came up with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A mobile app that could scan QR codes on a printed &lt;a href="http://www.atlassian.com/software/jira/overview/"&gt;JIRA&lt;/a&gt; story card and provide features such as assigning a card to yourself, moving it between columns and adding comments to it.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This is a common need. Most people will manage their stories in some sort of software such as JIRA. But it&amp;#8217;s also common to have a physical story wall.&lt;/p&gt;

&lt;p&gt;The problem then is keeping them in sync. It&amp;#8217;s all too common for people to move the cards on the well and forget all about JIRA.&lt;/p&gt;

&lt;p&gt;Well, not anymore. This is exactly what our HackDay project tackles.&lt;/p&gt;

&lt;p&gt;In 24 hours, we built two native mobile applications - Android and iPhone - that are able to scan QR Codes printed on the story cards and, through integrating with the JIRA REST API, provide all the necessary functionality needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assigning a story to yourself - whoever is logged in to the app&lt;/li&gt;
&lt;li&gt;Moving the story between states - e.g.: In Analysis, Resolve Issue, Reopen Issue etc&amp;#8230;&lt;/li&gt;
&lt;li&gt;Adding comments to a given story&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;All code is &lt;a href="https://github.com/ninemsn/cool-story"&gt;open source and on github&lt;/a&gt;. &lt;a href="https://github.com/ninemsn/cool-story"&gt;Check it out&lt;/a&gt;! - and bear in mind this was written in 24 hours&amp;#8230; ;)&lt;/p&gt;

&lt;p&gt;We didn&amp;#8217;t stop there though. We actually finished early and had a couple of hours to spare so we shot a video - yes, a video!!! - about the app. I&amp;#8217;m telling you, this is Hollywood quality:&lt;/p&gt;

&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/jzhY4JHDowI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;Also, checkout some screenshots of the Android version:&lt;/p&gt;

&lt;p&gt;
&lt;div class="gallery"&gt;
    &lt;a rel="gallery1" href="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-1.png" class="fancybox hoverZoomLink"&gt;
        &lt;img src="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-1.png" width="120" height="213"/&gt;
    &lt;/a&gt;
    &lt;a rel="gallery1" href="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-2.png" class="fancybox hoverZoomLink"&gt;
        &lt;img src="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-2.png" width="120" height="213"/&gt;
    &lt;/a&gt;
    &lt;a rel="gallery1" href="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-3.png" class="fancybox hoverZoomLink"&gt;
        &lt;img src="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-3.png" width="120" height="213"/&gt;
    &lt;/a&gt;
    &lt;a rel="gallery1" href="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-4.png" class="fancybox hoverZoomLink"&gt;
        &lt;img src="http://www.leonardoborges.com/writings/assets/images/posts/cool-story-4.png" width="120" height="213"/&gt;
    &lt;/a&gt;
    &lt;div class="clear"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;script src="http://www.leonardoborges.com/writings/javascripts/jquery.fancybox.pack.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
(function($){
    $('.fancybox').fancybox();
})(jQuery);
&lt;/script&gt;

Enjoy! :)

&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/NeJhlDqxvXY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/11/05/this-is-was-we-built-in-24-hours/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Clojure, leiningen 2 and Heroku: AOT compilation gotchas]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/qKeJAbeseIM/" />
    <updated>2012-09-10T10:41:00+10:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/09/10/clojure-leiningen-heroku-aot-compilation-gotchas</id>
    <content type="html">&lt;p&gt;Recently I upgraded the &lt;a href="http://clojure.org/"&gt;clojure&lt;/a&gt; project I&amp;#8217;m working on to &lt;a href="http://leiningen.org/"&gt;Leiningen 2&lt;/a&gt; in order to start using &lt;a href="https://github.com/clojure/tools.nrepl"&gt;nrepl&lt;/a&gt; - since &lt;a href="https://github.com/technomancy/swank-clojure"&gt;swank-clojure&lt;/a&gt; is now &lt;a href="http://technomancy.us/163"&gt;deprecated&lt;/a&gt;. Little did I know this would lead me to a small debugging adventure.&lt;/p&gt;

&lt;h3&gt;Heroku&lt;/h3&gt;

&lt;p&gt;I use &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt; as my deployment platform and my project had been running on it for a few weeks without any
issues. I also use Heroku&amp;#8217;s PostgreSQL solution.&lt;/p&gt;

&lt;p&gt;However, by upgrading to Leiningen 2, my project started throwing some weird exceptions during deployment -  it couldn&amp;#8217;t connect to my database any longer. Everything was fine on my local environment though.&lt;/p&gt;

&lt;p&gt;Upon inspecting the deployment logs on Heroku, I realized that the &lt;a href="https://github.com/heroku/heroku-buildpack-clojure"&gt;Heroku Clojure Buildpack&lt;/a&gt; tries to perform &lt;a href="http://clojure.org/compilation"&gt;Ahead of Time (AOT) compilation&lt;/a&gt; if it identifies the project is running Leiningen 2.x&lt;/p&gt;

&lt;p&gt;This means that after receiving a git push Heroku runs this command:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;lein with-profile production compile :all
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;At first this might seem harmless. But step back for a second and think about what this means for code that depends on environment variables.&lt;/p&gt;

&lt;h3&gt;Case in point: Lobos&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/budu/lobos"&gt;Lobos&lt;/a&gt; is a clojure library for manipulating database schemas akin &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html"&gt;ActiveRecord migrations&lt;/a&gt; in Ruby land.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/budu/lobos#real-world-example"&gt;real-world&lt;/a&gt; example on their github page recommends this code snippet for configuring a database connection:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ns&lt;/span&gt; &lt;span class="nv"&gt;lobos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;config&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:use&lt;/span&gt; &lt;span class="nv"&gt;lobos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;connectivity&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:classname&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;org.postgresql.Driver&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="nv"&gt;:subprotocol&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;postgresql&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="nv"&gt;:user&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="nv"&gt;:password&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;test123&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="nv"&gt;:subname&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;//localhost:5432/test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open-global&lt;/span&gt; &lt;span class="nv"&gt;db&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;More often than not this isn&amp;#8217;t ideal. You&amp;#8217;ll probably want to customise your database configuration based on environment variables. Something along these lines:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ns&lt;/span&gt; &lt;span class="nv"&gt;lobos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;config&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:use&lt;/span&gt; &lt;span class="nv"&gt;lobos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;connectivity&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:classname&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;org.postgresql.Driver&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nv"&gt;:subprotocol&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;postgresql&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nv"&gt;:user&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;System/getenv&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;DB_USER&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nv"&gt;:password&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;System/getenv&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;DB_PASSWORD&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nv"&gt;:subname&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;System/getenv&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;DATABASE_URL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open-global&lt;/span&gt; &lt;span class="nv"&gt;db&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And you&amp;#8217;re good to go - until Heroku decides to AOT compile your code.&lt;/p&gt;

&lt;h3&gt;Compilation&lt;/h3&gt;

&lt;p&gt;The Clojure compilation process caught me by surprise. As stated by &lt;a href="https://twitter.com/richhickey"&gt;Rich Hickey&lt;/a&gt; on &lt;a href="http://clojure-log.n01se.net/date/2008-11-12.html#16:07"&gt;this IRC log entry&lt;/a&gt;, &amp;#8220;a side effect of compiling Clojure code is loading the namespaces in order to make macros and functions they use available&amp;#8221;.&lt;/p&gt;

&lt;p&gt;This means that during compilation, any top level function calls - such as &lt;code&gt;(open-global db)&lt;/code&gt; from above - will get executed. The same applies to macros that expand to top-level function calls.&lt;/p&gt;

&lt;p&gt;If said function call has no side effects, you&amp;#8217;re probably ok.&lt;/p&gt;

&lt;p&gt;The trouble with &lt;em&gt;open-global&lt;/em&gt; though is that it effectively attempts a connection to the database!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BAM!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On Heroku the environment variables you rely on - such as &lt;em&gt;DATABASE_URL&lt;/em&gt; - aren&amp;#8217;t available on compile time meaning a connection will be attempted to an empty url. &lt;em&gt;All sorts of badness&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;After having understood why the compilation process was effectively executing top level function calls, I then wrapped that call to &lt;em&gt;open-global&lt;/em&gt; in a function declaration:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;init&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open-global&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;db&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This will prevent eager evaulation during compilation since all &lt;code&gt;defn&lt;/code&gt; does is bind the given function body to a &lt;em&gt;var&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then, in the code that needs migrations to happen - such as in my &lt;a href="https://github.com/marick/Midje"&gt;midje&lt;/a&gt; tests setup - I initialize the database like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;background&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;before&lt;/span&gt; &lt;span class="nv"&gt;:contents&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lobos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;config/init&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;before&lt;/span&gt; &lt;span class="nv"&gt;:facts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="nv"&gt;:after&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rollback&lt;/span&gt; &lt;span class="nv"&gt;:all&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I spent some time in the #clojure IRC channel on freenode and it is accepted that top level function calls should be avoided anyway - especially if you&amp;#8217;re dealing with side effects.&lt;/p&gt;

&lt;p&gt;I also applied the same principle to other initialization code I have such as the configuration for &lt;a href="http://sqlkorma.com/"&gt;Korma&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Happy ending?&lt;/h3&gt;

&lt;p&gt;Not quite. After having spent quite some time to get to this point, this was the new error that was stealing my sleep:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;Caused by: java.lang.NullPointerException
&lt;/span&gt;&lt;span class='line'&gt;    at java.util.concurrent.ConcurrentHashMap.hash&lt;span class="o"&gt;(&lt;/span&gt;ConcurrentHashMap.java:332&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at java.util.concurrent.ConcurrentHashMap.get&lt;span class="o"&gt;(&lt;/span&gt;ConcurrentHashMap.java:987&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at clojure.lang.Namespace.find&lt;span class="o"&gt;(&lt;/span&gt;Namespace.java:188&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at clojure.core&lt;span class="nv"&gt;$find_ns&lt;/span&gt;.invoke&lt;span class="o"&gt;(&lt;/span&gt;core.clj:3659&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at clojure.core&lt;span class="nv"&gt;$the_ns&lt;/span&gt;.invoke&lt;span class="o"&gt;(&lt;/span&gt;core.clj:3691&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at clojure.core&lt;span class="nv"&gt;$ns_name&lt;/span&gt;.invoke&lt;span class="o"&gt;(&lt;/span&gt;core.clj:3698&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at my_app.env__init.load&lt;span class="o"&gt;(&lt;/span&gt;Unknown Source&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    at my_app.env__init.&amp;lt;clinit&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;Unknown Source&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This isn&amp;#8217;t an unknown error. It basically means you&amp;#8217;re trying to find a namespace that doesn&amp;#8217;t exist. Or does it?&lt;/p&gt;

&lt;p&gt;Once again this only happened if the code got compiled Ahead Of Time. Puzzling.&lt;/p&gt;

&lt;p&gt;A couple of debugging hours later and I tracked it down to be a problem with &lt;a href="https://github.com/malcolmsparks/clj-logging-config"&gt;clj-logging-config&lt;/a&gt; - a logging configuration utility for clojure. This is the offending code:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ns&lt;/span&gt; &lt;span class="nv"&gt;my-app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;env&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:use&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;clojure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;clj-logging-config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;log4j&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set-logger!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;;; this call causes the exception&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;code&gt;set-logger!&lt;/code&gt; is a macro that makes use of the &lt;strong&gt;*ns*&lt;/strong&gt; var. &lt;strong&gt;*ns*&lt;/strong&gt; contains the current namespace and, due to what I&amp;#8217;m assuming to be special semantics regarding this particular var, it shouldn&amp;#8217;t be &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/unquote"&gt;&lt;em&gt;unquoted&lt;/em&gt;&lt;/a&gt; within a macro - which is why it was failing in AOT mode.&lt;/p&gt;

&lt;p&gt;I &lt;a href="https://github.com/malcolmsparks/clj-logging-config/issues/15"&gt;opened an issue&lt;/a&gt; in the clj-logging-config github page. I eventually forked the project and fixed the issue in &lt;a href="https://github.com/malcolmsparks/clj-logging-config/pull/16"&gt;this pull request&lt;/a&gt;. That was then &lt;a href="https://github.com/malcolmsparks/clj-logging-config/commit/ec8a08535daad01eb9f23e92771b623b5902c8c9"&gt;merged last Friday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My code now works perfectly - regardless of AOT compilation.&lt;/p&gt;

&lt;h3&gt;Final thoughts&lt;/h3&gt;

&lt;p&gt;This was a nice little journey and I&amp;#8217;m actually glad I went through it. I have a much better understanding of Clojure&amp;#8217;s compilation process, worked out some quirks on Heroku and even got my first Clojure related open-source contribution accepted. Life is good.&lt;/p&gt;

&lt;p&gt;Hopefully this will save other people a lot of time and effort debugging similar issues.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/qKeJAbeseIM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/09/10/clojure-leiningen-heroku-aot-compilation-gotchas/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Sean Corfield: Clojure and CFML sitting in a tree]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/4EzVJxR3TxU/" />
    <updated>2012-08-23T00:03:00+10:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/08/23/sean-corfield-clojure-and-cfml-sitting-in-a-tree</id>
    <content type="html">&lt;p&gt;Last night I attended the Adobe User Group here in Sydney. That might strike some of you as a big surprise
given my relationship with Adobe is pretty much limited to fiddling with Photoshop/Lightroom to get my photos looking nice.&lt;/p&gt;

&lt;p&gt;However the reason for which I attended the meetup is that &lt;a href="https://twitter.com/seancorfield"&gt;Sean Corfield&lt;/a&gt; - a prolific member of the Clojure community - gave a presentation on how he introduced and migrated most of his backend code at &lt;a href="http://worldsingles.com/ws2010/index.cfm"&gt;World Singles&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/ColdFusion_Markup_Language"&gt;CFML&lt;/a&gt; to &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; - hence my interest.&lt;/p&gt;

&lt;p&gt;What follows is a mix of my own notes and what I could remember from the slides:&lt;/p&gt;

&lt;h3&gt;Going faster&lt;/h3&gt;

&lt;p&gt;The original platform was built in CFML between 2001 and 2008. It was essentially monolithic procedural code. It was rewritten in 2009 - when they introduced OO and a new version of CFML&lt;/p&gt;

&lt;h3&gt;Brief Stats&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;3 million members&lt;/li&gt;
&lt;li&gt;1 million emails sent every day&lt;/li&gt;
&lt;li&gt;2k concurrent users 24x7, on average&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Clojure and WorldSingles&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tried .NET - ran into all sorts of trouble. Didn&amp;#8217;t work well in production.&lt;/li&gt;
&lt;li&gt;Tried Scala - Memory leaks in the built-in actor library were a deal breaker. The type system also wasn&amp;#8217;t a good cultural fit.&lt;/li&gt;
&lt;li&gt;Evaluated Clojure in 2010 - seemed like a good language to squeeze performance out of lower level components&lt;/li&gt;
&lt;li&gt;Clojure version released in production in 2011

&lt;ul&gt;
&lt;li&gt;Rewrote remaining Scala Code&lt;/li&gt;
&lt;li&gt;6.3k LOC - 1.5k Tests LOC&lt;/li&gt;
&lt;li&gt;equivalent to 4x the CFML LOC&lt;/li&gt;
&lt;li&gt;Clojure is essentially used in the model (as in MVC)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Why add Clojure?&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It&amp;#8217;s fast - compiles down to JVM bytecode (and it&amp;#8217;s faster than CFML)&lt;/li&gt;
&lt;li&gt;Immutability (automatic thread safety)

&lt;ul&gt;
&lt;li&gt;they found several thread safety bugs in the third party ColdFusion libraries being used&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Built-in concurrency / parallelism support - &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/future"&gt;future&lt;/a&gt;, &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/pmap"&gt;pmap&lt;/a&gt;, &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/pvalues"&gt;pvalues&lt;/a&gt; etc.&lt;/li&gt;
&lt;li&gt;Lazy sequences - being able to work with potentially ininite collections without bringing your server down.&lt;/li&gt;
&lt;li&gt;All high quality, production ready Java libraries easily accessible via &lt;a href="http://clojure.org/java_interop"&gt;java interop&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;What do they use it for?&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Email

&lt;ul&gt;
&lt;li&gt;html generation &amp;amp; sending&lt;/li&gt;
&lt;li&gt;tracking &amp;amp; log file analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Geolocation (rest/json)&lt;/li&gt;
&lt;li&gt;i18n&lt;/li&gt;
&lt;li&gt;Reporting (parallel queries) - he showed a bit of this code. Heavy use of &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/future"&gt;futures&lt;/a&gt; + &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/deref"&gt;deref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search engine integration (json/xml)

&lt;ul&gt;
&lt;li&gt;This breaks down to two Clojure components:&lt;/li&gt;
&lt;li&gt;One feeds the search engine based on changes to the users profiles&lt;/li&gt;
&lt;li&gt;The other then runs against the search engine 24x7 trying to find new matches for users&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(lightweight?) Persistence layer

&lt;ul&gt;
&lt;li&gt;no ORM - thin framework over sql instead&lt;/li&gt;
&lt;li&gt;Same interface for both Mysql &amp;amp; MongoDB&lt;/li&gt;
&lt;li&gt;MongoDB being used after hitting performance issues in Mysql&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Clojure ecosystem/community&lt;/h3&gt;

&lt;p&gt;Having an active Community is crucial for language adoption and the clojure community got this right:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Community

&lt;ul&gt;
&lt;li&gt;6700 developers on the &lt;a href="https://groups.google.com/forum/?fromgroups#!forum/clojure"&gt;mailing list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;~300 developers on IRC 24x7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Active library development

&lt;ul&gt;
&lt;li&gt;#23 language on Github&lt;/li&gt;
&lt;li&gt;Over 7k projects on github&lt;/li&gt;
&lt;li&gt;Nearly 2k libs on &lt;a href="https://clojars.org/"&gt;Clojars&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;The Future&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Looking into &lt;a href="https://github.com/nathanmarz/cascalog"&gt;Cascalog&lt;/a&gt; for big data processing&lt;/li&gt;
&lt;li&gt;All new back-end/model code written in Clojure&lt;/li&gt;
&lt;li&gt;Views/Controllers will remain in CFML

&lt;ul&gt;
&lt;li&gt;This ties up with Sean&amp;#8217;s answer to &amp;#8216;What would you not use Clojure for?&amp;#8217;&lt;/li&gt;
&lt;li&gt;He mentioned HTML rendering as the major reason. You can&amp;#8217;t hand &lt;a href="https://github.com/weavejester/hiccup"&gt;hiccup&lt;/a&gt; code to a designer.&lt;/li&gt;
&lt;li&gt;Similarly, while designers can work on &lt;a href="https://github.com/cgrand/enlive"&gt;Enlive&lt;/a&gt; templates, updating the dynamic bits in Clojure can be cumbersome.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;It was great to hear the many good things Sean had to say about Clojure. WorldSingles seem pretty happy with the decision of migration their heavy-lifting code to it and hopefully these slide notes will give you some insight into the sort of things Clojure is good at.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;Sean is likely to put his slides up somewhere so I&amp;#8217;ll link to it as soon as I have it.&lt;/del&gt; &lt;a href="http://corfield.org/articles/WorldSinglesWeb.pdf"&gt;Here they are.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to know more about Clojure and be involved in the community, you should come to the next &lt;a href="http://www.meetup.com/clj-syd/"&gt;clj-syd meetup&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/4EzVJxR3TxU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/08/23/sean-corfield-clojure-and-cfml-sitting-in-a-tree/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Build automation with XCode 4.3, KIF and Jenkins]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/JTFrlBJRhv4/" />
    <updated>2012-05-03T13:17:00+10:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/05/03/build-automation-with-xcode-4-dot-3-kif-and-jenkins</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; As pointed to me in &lt;a href="http://www.leonardoborges.com/writings/2012/05/03/build-automation-with-xcode-4-dot-3-kif-and-jenkins/#comment-703288043"&gt;this commment&lt;/a&gt;, sym links aren&amp;#8217;t necessary for Waxsim anymore. Check &lt;a href="https://github.com/jonathanpenn/WaxSim"&gt;Jonathan Penn&amp;#8217;s fork on github&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;After coming back from my holidays in China - which were awesome - I had no downtime at ThoughtWorks and started at a brand new client/project - a much needed change from what I had been working on lately.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s an iOS project, more specifically an iPad app and that&amp;#8217;s pretty much all I can tell you about it. I will however tell you how my first few days in the project have been so far.&lt;/p&gt;

&lt;p&gt;Being a brand new project I wanted to get our &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;CI&lt;/a&gt; environment up and running as fast as possible - after all the project has only a couple of tests now. For context, here&amp;#8217;s our setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XCode 4.3&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gabriel/gh-unit"&gt;GHUnit&lt;/a&gt; (I&amp;#8217;m not gonna talk too much about it since this was the easy part - their docs are pretty decent)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/KIF"&gt;KIF&lt;/a&gt; (for UI tests)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/waxsim"&gt;WaxSim&lt;/a&gt; (Hack to get the iPhone Simulator to run on the command line)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;In most environments I had worked so far - Java, Ruby, Clojure etc.. - running acceptance tests from the command line is a given and so is integrating that into your build system.&lt;/p&gt;

&lt;p&gt;Well, that&amp;#8217;s just not the case with iOS projects. These tasks can be a real pain and take a while to complete. Here&amp;#8217;s what I had to do:&lt;/p&gt;

&lt;h3&gt;On your development Mac&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m assuming here you have an XCode project with at least one KIF test and that it builds successfully from the GUI, when you hit play. Now we can move on to run the tests from the command line.&lt;/p&gt;

&lt;p&gt;This is the script I&amp;#8217;m using to run my KIF tests. I call it &lt;code&gt;RunKIF.sh&lt;/code&gt; and  will walk you through it:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;killall &lt;span class="s2"&gt;&amp;quot;iPhone Simulator&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;rm /tmp/KIF-*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Build the &amp;quot;&lt;/span&gt;UI Tests&lt;span class="s2"&gt;&amp;quot; target to run in the simulator&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;xcodebuild -target &lt;span class="s2"&gt;&amp;quot;UI Tests&amp;quot;&lt;/span&gt; -configuration Release -sdk iphonesimulator clean build
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;OUT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/KIF-&lt;span class="nv"&gt;$$&lt;/span&gt;.out
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Run the app we just built in the simulator and send its output to a file&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# /path/to/MyApp.app should be the relative or absolute path to the application bundle that was built in the previous step&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Running KIF tests&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;/tmp/waxsim -f &lt;span class="s2"&gt;&amp;quot;ipad&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;build/Release-iphonesimulator/MyApp.app&amp;quot;&lt;/span&gt; &amp;gt; &lt;span class="nv"&gt;$OUT_FILE&lt;/span&gt; 2&amp;gt;&amp;amp;1
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# WaxSim hides the return value from the app, so to determine success we search for a &amp;quot;no failures&amp;quot; line&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;grep -q &lt;span class="s2"&gt;&amp;quot;TESTING FINISHED: 0 failures&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;$OUT_FILE&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;success&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;exec &lt;/span&gt;grep -c &lt;span class="s2"&gt;&amp;quot;TESTING FINISHED: 0 failures&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;$OUT_FILE&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# if there was a failure, show what waxsim was hiding and crucially return with a non-zero exit code&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$success&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;then &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;    &lt;/span&gt;cat &lt;span class="nv"&gt;$OUT_FILE&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;===========================================&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GUI Tests failed&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;===========================================&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;===========================================&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GUI Tests passed&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;===========================================&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You&amp;#8217;ll notice there are mainly two things happening in this script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It runs xcodebuild to build the target against which your tests will run&lt;/li&gt;
&lt;li&gt;uses WaxSim to finally run your tests&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;To get the building step to work, despite what KIF&amp;#8217;s documentation DOESN&amp;#8217;T tell you, you need to add KIF as a target dependency to your KIF Tests target. &lt;a href="http://stackoverflow.com/questions/10000600/build-error-on-zapp-when-running-iphone-app-with-kif-testsuites"&gt;This SO thread&lt;/a&gt; can walk you through it.&lt;/p&gt;

&lt;p&gt;Now on to the fun stuff!
For some reason I didn&amp;#8217;t have the time to dig into, WaxSim seems to expect XCode to be under &lt;code&gt;/Developer/&lt;/code&gt; on your Mac.&lt;/p&gt;

&lt;p&gt;The problem is that since Apple started distributing Xcode through the AppStore, it now lives under &lt;code&gt;/Applications/Xcode.app/Contents/Developer/&lt;/code&gt;. Bam! This can cause all sorts of issues when building both WaxSim and your project. So if you see weird error messages complaining about not being able to find &lt;code&gt;DevToolsFoundation.framework&lt;/code&gt; and the like, these sym links will probably fix things for you:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/Developer/ /Developer
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsCore.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsCParsing.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsFoundation.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsInterface.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsKit.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsRemoteClient.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;span class='line'&gt;sudo ln -s /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsSupport.framework /Developer/Library/PrivateFrameworks/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I know, right? Moving on.&lt;/p&gt;

&lt;p&gt;By now you should be able to successfully run &lt;code&gt;RunKIF.sh&lt;/code&gt; and get meaningful results from your test. Let&amp;#8217;s configure our CI server now, shall we?&lt;/p&gt;

&lt;h3&gt;On your CI Mac&lt;/h3&gt;

&lt;p&gt;Depending on which state your build box is, you might need to create the same sym links I created in the previous section. So ssh into your build box and try to build your project from the command line:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;xcodebuild -target &lt;span class="s2"&gt;&amp;quot;UI Tests&amp;quot;&lt;/span&gt; -configuration Release -sdk iphonesimulator clean build
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This time I&amp;#8217;ll assume you already have Jenkins installed and running.&lt;/p&gt;

&lt;p&gt;Your Jenkins server is probably running as the jenkins user. You need to change that. Jenkins has to be running within a Desktop session - that&amp;#8217;s a requirement from WaxSim.
It needs an active desktop session in order to launch the simulator - and thus needs to run as a user who can login to your CI Mac.&lt;/p&gt;

&lt;p&gt;If you installed Jenkins using Homebrew, here&amp;#8217;s a plist you can use to specify which user jenkins should run as:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Jenkins&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/usr/bin/java&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;-jar&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/usr/local/Cellar/jenkins/1.439/lib/jenkins.war&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;UserName&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;UserWhoCanLogintoThisMac&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then load the new plist:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;launchctl load -w  /Users/UserWhoCanLogintoThisMac/Library/LaunchAgents/org.jenkins-ci.plist
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Don&amp;#8217;t forget to enable automatic login on the CI Mac for the user Jenkins is using. Check &lt;a href="http://www.tech-faq.com/how-to-re-enable-mac-os-x-automatic-login.html"&gt;this article&lt;/a&gt; to learn how to do it.&lt;/p&gt;

&lt;p&gt;Now we&amp;#8217;re mostly done. Just go ahead and configure your project.&lt;/p&gt;

&lt;p&gt;Add a build step of the type &lt;code&gt;Execute Shell&lt;/code&gt; and provide &lt;code&gt;sh RunKIF.sh&lt;/code&gt; as the command string. Trigger your build and everything should work as expected.&lt;/p&gt;

&lt;h3&gt;Final thoughts&lt;/h3&gt;

&lt;p&gt;Once I actually got these steps together to write this post, it didn&amp;#8217;t look like much. But the amount of time I wasted finding out what had to be done to actually make this work is just insane.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m shocked at how much behind iOS development tools seem to be. It just shouldn&amp;#8217;t take this much effort and time only to get some UI tests automated. So far I&amp;#8217;m disappointed with the tooling around the Apple ecosystem and I really hope this improves sooner rather than later.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/JTFrlBJRhv4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/05/03/build-automation-with-xcode-4-dot-3-kif-and-jenkins/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[clj-syd report #0]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/WsaphdwLr2M/" />
    <updated>2012-02-22T21:14:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/02/22/clj-syd-report-number-0</id>
    <content type="html">&lt;p&gt;Last night we held the first ever meetup for the &lt;a href="http://groups.google.com/group/clj-syd"&gt;Sydney Clojure User Group&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;When I decided to start running the meetups I had no idea we&amp;#8217;d end up with &lt;strong&gt;37&lt;/strong&gt;
people on the first night! What a great turn out!&lt;/p&gt;

&lt;p&gt;As for the content, here&amp;#8217;s what you missed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Running Clojure apps on Heroku&lt;/strong&gt; - Lincoln Stoll (&lt;a href="https://twitter.com/#!/lstoll"&gt;@lstoll&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Linc works for Heroku but ended up not spending a whole lot of time talking about
that - instead he showed us how  to build a simple web application using
&lt;a href="https://github.com/weavejester/compojure/wiki"&gt;Compojure&lt;/a&gt;, a small Clojure web framework.&lt;/p&gt;

&lt;p&gt;He then evolved the example by implementing it using &lt;a href="http://webnoir.org/"&gt;Noir&lt;/a&gt; - yet another web
framework that builds on top of &lt;a href="https://github.com/weavejester/compojure/wiki"&gt;Compojure&lt;/a&gt;, adding some helpful macros.&lt;/p&gt;

&lt;p&gt;To top it off, the UI was implemented in &lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt; - so that was all Clojure
from end to end!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Paredit (in Eclipse) for the IDE junkie&lt;/strong&gt; - Matt Quail (&lt;a href="https://twitter.com/#!/spudbean"&gt;@spudbean&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;If you&amp;#8217;re into lisps and use emacs - if not you &lt;strong&gt;should&lt;/strong&gt; anyway - you learned to
love &lt;a href="http://www.emacswiki.org/emacs/ParEdit"&gt;paredit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, not everyone gets to write Clojure for a living and a lot of us end up in
some sort of IDE. If you&amp;#8217;re in Java land, a popular choice is Eclipse and Matt showed
us how you can get the paredit goodness right there using the Eclipse plugin &lt;a href="http://code.google.com/p/counterclockwise/"&gt;counterclockwise&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://offbytwo.com/presentations/building-better-repl.pdf"&gt;Building a better Clojure REPL&lt;/a&gt;&lt;/strong&gt; - Cosmin Sterejean (&lt;a href="https://twitter.com/#!/offbytwo"&gt;@offbytwo&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Frustrated with the Clojure REPL? Wish you had more useful shortcuts? Decent line
editing? Saving that nice function you&amp;#8217;ve been working on right from the REPL? Then
make sure you check out both the &lt;a href="http://offbytwo.com/presentations/building-better-repl.pdf"&gt;presentation&lt;/a&gt; and &lt;a href="https://github.com/cosmin/IClojure"&gt;IClojure&lt;/a&gt;, Cosmin&amp;#8217;s
project.&lt;/p&gt;

&lt;p&gt;Definetly worth a try.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.google.com/open?id=0B-wuNsBziQXAZWZmMzdjMDQtYzM4Zi00NGNjLThhY2ItYTFhOTZkOTQ0OTBh"&gt;Where do I put my DependentStrategyTemplateAbstractFactory&lt;/a&gt;?&lt;/strong&gt; - Bayan Khalili&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Bayan was in one of our internal meetups. Some people raised the fact that we don&amp;#8217;t
see a lot of the design patterns made popular by the &lt;a href="http://amzn.to/wdq6Lr"&gt;GoF book&lt;/a&gt; in languages such as Ruby, Python or Clojure
and the overall opinion is that in those languages, some of the problems these
patterns solve in, say, Java, simply don&amp;#8217;t exist.&lt;/p&gt;

&lt;p&gt;Bayan decided to dig up a few and show what&amp;#8217;s the alternative in Clojure. Interesting
perspective.&lt;/p&gt;

&lt;h2&gt;Want more?&lt;/h2&gt;

&lt;p&gt;Join us on &lt;a href="http://groups.google.com/group/clj-syd"&gt;Google Groups&lt;/a&gt;, submit a talk proposal on the &lt;a href="https://github.com/clj-syd/clj-syd/wiki"&gt;wiki&lt;/a&gt; and RSVP to
the &lt;a href="http://www.meetup.com/clj-syd/"&gt;next meetup&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;See you next time!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/WsaphdwLr2M" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/02/22/clj-syd-report-number-0/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Project Euler: problem 4 in clojure]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/6sSysFQ9cAs/" />
    <updated>2012-02-05T13:29:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/02/05/project-euler-problem-4-in-clojure</id>
    <content type="html">&lt;p&gt;I solved a few of the problems on &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt; in the past, both in Java and Ruby, and thought it would be useful to redo them in Clojure, thus improving my skills on the language&amp;#8217;s core functions and libraries. Today I&amp;#8217;ll share &lt;a href="http://projecteuler.net/problem=4"&gt;problem 4&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Go ahead and read it but here&amp;#8217;s the meat of it:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;#8220;Find the largest palindrome made from the product of two 3-digit numbers.&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From this statement we can tell two things: (1) we&amp;#8217;ll need a function that can tell whether a number is a &lt;a href="http://en.wikipedia.org/wiki/Palindrome"&gt;palindrome&lt;/a&gt; or not and (2) that the largest palindrome is given by the product of two numbers between 100 and 999, inclusive.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s tackle number one first:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;palindrome?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;= &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt; &lt;span class="nv"&gt;str&lt;/span&gt; &lt;span class="nv"&gt;reverse&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;With our utility function in hand, one possible solution might be as follows:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;largest-palindrome&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;palindrome?&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                           &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;largest-palindrome&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;&amp;quot;Elapsed time: 1405.358 msecs&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;While this works, I wasn&amp;#8217;t happy with a couple of things in this solution. First, I thought I could do without using &lt;em&gt;filter&lt;/em&gt;. Second, we have unnecessary multiplications going on, leading to poor performance - it takes ~1.4secs to finish.&lt;/p&gt;

&lt;p&gt;You see, when we begin multiplying the numbers, we&amp;#8217;ll see multiplications such as &lt;em&gt;100 * 100, 100 * 101, 100 * 102 &amp;#8230;&lt;/em&gt; and then again, after the first loop is exhausted, &lt;em&gt;102 * 100, 102 * 101, 102 * 102 &amp;#8230;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That led me to take a closer look at &lt;a href="http://clojuredocs.org/clojure_core/clojure.core/for"&gt;for&lt;/a&gt;, Clojure&amp;#8217;s list comprehension macro. It&amp;#8217;s a very powerful construct, providing 3 useful modifiers: &lt;em&gt;let&lt;/em&gt;, &lt;em&gt;while&lt;/em&gt; and &lt;em&gt;when&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;With that in mind, I refactored my first solution to look like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;largest-palindrome-1&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="nv"&gt;:while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&amp;gt;= &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="nv"&gt;:let&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;* &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                   &lt;span class="nv"&gt;:when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;palindrome?&lt;/span&gt; &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;               &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;largest-palindrome-1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;;;&amp;quot;Elapsed time: 689.262 msecs&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Here, the &lt;em&gt;while&lt;/em&gt; modifier makes sure we aren&amp;#8217;t wasting any time with unnecessary multiplications. The &lt;em&gt;when&lt;/em&gt; modifier lets us get rid of the outer &lt;em&gt;filter&lt;/em&gt; call.  And as you can see, the solution is about twice as fast as its first version.&lt;/p&gt;

&lt;p&gt;On top of that, it&amp;#8217;s still pretty concise. Not bad.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/6sSysFQ9cAs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/02/05/project-euler-problem-4-in-clojure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Backlog: Ola Bini on Clojure/conj]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/AWQiZJFyOuM/" />
    <updated>2012-01-22T22:01:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/01/22/backlog-ola-bini-on-clojure-conj</id>
    <content type="html">&lt;p&gt;As I promised in my &lt;a href="http://bit.ly/clj-syd"&gt;previous post&lt;/a&gt;, here are the highlights of what &lt;a href="http://olabini.com/blog/"&gt;Ola Bini&lt;/a&gt; had to say about &lt;a href="http://clojure-conj.org/"&gt;Clojure/conj&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Clojure/conj is the largest gathering of clojure programmers, hackers and enthusiasts, with a single track of talks spanning three days.
Ola selected his favorite talks and summarised each one of them.&lt;/p&gt;

&lt;p&gt;The actual slides for each one of the talks can be found on &lt;a href="https://github.com/relevance/clojure-conj"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can find Ola&amp;#8217;s slides &lt;a href="http://db.tt/lTFsOKpZ"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Fun Data Structures&lt;/h3&gt;

&lt;p&gt;This is certainly a very interesting topic. The highlight here is the approach Clojure takes to handling immutable data structures efficiently: persistent data structures through structural sharing - maybe a good short talk for the next meetup?&lt;/p&gt;

&lt;p&gt;However, even though efficient, there are cases where the space complexity of known algorithms gets compromised.
More specifically, algorithms that rely on the ability of changing data structures in-place - such as the QuickSort - will suffer from this approach.&lt;/p&gt;

&lt;p&gt;I asked Ola about it and the short answer is that you should use a different algorithm that takes advantages of trees instead, since they often don&amp;#8217;t rely on in-place changing.&lt;/p&gt;

&lt;p&gt;The long answer is a book called &lt;a href="http://amzn.to/zXbvtu"&gt;Purely Functional Data Structures&lt;/a&gt; - another one added to my wish list.&lt;/p&gt;

&lt;h3&gt;Logic/constraint programming&lt;/h3&gt;

&lt;p&gt;This is a topic that&amp;#8217;s completely new to me and it sounds fascinating at first. It also ended up being the topic of the rest of the tech night, with Ola, Sarah and Jo - also ThoughtWorkers - giving us a Logic Programming 101 crash course using Prolog. Lots to read up on.&lt;/p&gt;

&lt;p&gt;In the Clojure world, logic programming can be achieved via &lt;a href="https://github.com/clojure/core.logic"&gt;core.logic&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The book &lt;a href="http://amzn.to/y6vhT5"&gt;The Reasoned Schemer&lt;/a&gt; was also mentioned as a good read on the subject.&lt;/p&gt;

&lt;h3&gt;Cascalog (&lt;a href="https://github.com/nathanmarz/cascalog"&gt;github repo&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;Haven&amp;#8217;t had the time to play with it yet but it seems extremely useful. It&amp;#8217;s a Clojure-based DSL for processing &amp;#8220;Big Data&amp;#8221; on top of Hadoop.&lt;/p&gt;

&lt;p&gt;There you have it. Come &lt;a href="http://bit.ly/yLfPTr"&gt;join us&lt;/a&gt; for our next meeting!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/AWQiZJFyOuM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/01/22/backlog-ola-bini-on-clojure-conj/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Announcing the Sydney Clojure User Group]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/l8s9Yb8CwO4/" />
    <updated>2012-01-20T11:35:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/01/20/announcing-the-sydney-clojure-user-group</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; We now have a &lt;a href="http://www.meetup.com/clj-syd/"&gt;Meetup.com page&lt;/a&gt;. Head over there to learn about our next meetups as well as to RSVP to them. We&amp;#8217;ll discontinue usage of the wiki for registering attendees, in favor of the new site. Everything else on this post however still holds.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.leonardoborges.com/writings/2011/10/12/report-clojure-meetup-1/"&gt;If you&amp;#8217;ve been following my blog&lt;/a&gt;, you&amp;#8217;ll have noticed I started running internal Clojure meetups/hack nights at ThoughtWorks here in Sydney a while ago. While being closed, we&amp;#8217;ve already had one international speaker - &lt;a href="http://olabini.com/blog/"&gt;Ola Bini&lt;/a&gt; - come and share his experience as an attendee at &lt;a href="http://clojure-conj.org/"&gt;Clojure/conj&lt;/a&gt;. I promise I&amp;#8217;ll blog about it soon.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re a small but active group, eager to learn and as a natural result we couldn&amp;#8217;t stay closed for any longer! :)&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s why last Tuesday, the first time we had external guests, we decided to make the group public so anyone could join.&lt;/p&gt;

&lt;p&gt;It was great having people from outside ThoughtWorks sharing their real world experience with Clojure. One of them, Harry Binnendijk from &lt;a href="http://www.whoto.com/"&gt;Whoto&lt;/a&gt;, even gave a presentation about how and why they&amp;#8217;re using Clojure &lt;em&gt;[1]&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There was another talk, by yours truly, on &lt;a href="http://www.slideshare.net/borgesleonardo/continuation-passing-style-and-macros-in-clojure-jan-2012"&gt;Continuation Passing Style and Macros in Clojure&lt;/a&gt;. It was a great night.&lt;/p&gt;

&lt;p&gt;Interested? Read on.&lt;/p&gt;

&lt;p&gt;Our meetings will be held on the 3rd Tuesday of every month - at least to start with.&lt;/p&gt;

&lt;p&gt;To help organize things we have a &lt;a href="http://groups.google.com/group/clj-syd"&gt;Google group&lt;/a&gt; where we&amp;#8217;ll announce the next meetings, do the traditional &amp;#8220;call for papers&amp;#8221;, share ideas on how to improve our group, job posts and anything related to Clojure/FP.&lt;/p&gt;

&lt;p&gt;We also have a &lt;a href="https://github.com/clj-syd/clj-syd/wiki"&gt;wiki&lt;/a&gt; where you can see when and where the meetings are happening, sign up to talk/attend etc&amp;#8230;&lt;/p&gt;

&lt;p&gt;So if you&amp;#8217;ve been thinking about learning Clojure but haven&amp;#8217;t had the chance yet, &lt;a href="http://groups.google.com/group/clj-syd"&gt;come join us&lt;/a&gt;. Joining a group like this in its beginning is a perfect learning opportunity.&lt;/p&gt;

&lt;p&gt;And if you&amp;#8217;re a Clojure hacker already, &lt;a href="http://groups.google.com/group/clj-syd"&gt;we&amp;#8217;d love to hear from you just as much&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;We welcome all levels and encourage everyone to submit talks they&amp;#8217;re passionate about.&lt;/p&gt;

&lt;p&gt;I hope to see you in the next meet up. Feel free to shoot the group an email or to me directly at leonardoborges(dot)rj(at)gmail(dot)com&lt;/p&gt;

&lt;p&gt;And don&amp;#8217;t forget to add us to your calendar so you don&amp;#8217;t miss out - next meetup will be on Feb 21st at ThoughtWorks Sydney!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.google.com/calendar/render?cid=https%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fa4v3blgfnlqdc0h6im9okr80tc%2540group.calendar.google.com%2Fpublic%2Fbasic" target="_blank"&gt;&lt;img src="http://www.google.com/calendar/images/ext/gc_button1.gif" alt="0" border="0" style="border:none;"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[1] Link to the presentation will be available soon&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/l8s9Yb8CwO4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/01/20/announcing-the-sydney-clojure-user-group/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[So long 2011: Year highlights]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/h7IPKvyNrYE/" />
    <updated>2012-01-01T16:20:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2012/01/01/so-long-2011-year-highlights</id>
    <content type="html">&lt;p&gt;It&amp;#8217;s that time of the year to look back at what you&amp;#8217;ve done and either be happy about it or&amp;#8230; well not. :)&lt;/p&gt;

&lt;p&gt;To me anyway 2011 was a great year but I won&amp;#8217;t bore you with the details so I&amp;#8217;ll just jump straight into a couple of highlights!&lt;/p&gt;

&lt;p&gt;The biggest one of course was the project we developed to help the &lt;a href="http://www.leonardoborges.com/writings/2011/01/16/clouds-against-the-floods/"&gt;Queensland flood victims back in January&lt;/a&gt; - which brings me to the next topic:&lt;/p&gt;

&lt;h3&gt;Speaking&lt;/h3&gt;

&lt;p&gt;Said project gave me the chance to speak at a few events, sharing this and other great stories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby On Rails Oceania User Group - Sydney - February (&lt;a href="http://www.slideshare.net/borgesleonardo/clouds-against-the-floods"&gt;slides&lt;/a&gt; | &lt;a href="http://www.youtube.com/watch?v=DYDD9XiW3Gg&amp;amp;feature=player_embedded"&gt;video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;CloudCamp - Sydney - July (&lt;a href="http://www.slideshare.net/borgesleonardo/clouds-against-the-floods"&gt;slides&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;XConf (1) Australia - Melbourne - August&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leonardoborges.com/writings/2011/11/10/rubyconf-brazil-2011/"&gt;RubyConf Brazil - Sao Paulo - November&lt;/a&gt; (&lt;a href="http://www.slideshare.net/borgesleonardo/clouds-against-the-floods-rubyconfbr2011"&gt;slides&lt;/a&gt; | &lt;a href="http://www.eventials.com/rubyconfbr/recorded/M2UzZTJkMzY2MzdiNTg2NTUxNWM1MzI3NWY1YjRhMzYjIzM4Mg_3D_3D"&gt;video&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;(1) - XConf is an internal technical conference here at ThoughtWorks&lt;/p&gt;

&lt;h3&gt;Content&lt;/h3&gt;

&lt;p&gt;Here in the blog, these are a few of the most popular articles for 2011:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.leonardoborges.com/writings/2008/08/07/why-i-like-ruby-1-alias_method/"&gt;Why I Like Ruby #1: Alias_method&lt;/a&gt; - This one still surprises me. It&amp;#8217;s been at the top for a while&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leonardoborges.com/writings/2011/02/16/ide-review-rubymine/"&gt;IDE Review: RubyMine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leonardoborges.com/writings/2011/01/16/clouds-against-the-floods/"&gt;Clouds against the Floods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leonardoborges.com/writings/2011/04/25/one-year-of-thoughtworks-a-retrospective/"&gt;One Year of ThoughtWorks: A Retrospective&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Languages&lt;/h3&gt;

&lt;p&gt;I decided to learn Clojure and started an internal user group at ThoughtWorks Sydney - you can read a brief report on our first meetup &lt;a href="http://www.leonardoborges.com/writings/2011/10/12/report-clojure-meetup-1/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The group&amp;#8217;s been a bit off lately since I was on leave in Brazil and then the whole holiday season happened but it&amp;#8217;s definitely one of the things I want to make happen more often in the new year.&lt;/p&gt;

&lt;p&gt;Clojure is a great language and I expect it to keep gaining a lot of traction in 2012.&lt;/p&gt;

&lt;h3&gt;And I guess that&amp;#8217;s it&amp;#8230;&lt;/h3&gt;

&lt;p&gt;A lot more happened in the last 12 months but these are definitely my favourite parts.&lt;/p&gt;

&lt;p&gt;Happy new year everyone! I&amp;#8217;m sure 2012 has a lot of new challenges and surprises for us :D&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/h7IPKvyNrYE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2012/01/01/so-long-2011-year-highlights/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Help Keep RottingNames On The Appstore]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/xcIPst4vrzU/" />
    <updated>2011-12-07T00:00:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2011/12/07/help-keep-rottingnames-on-the-appstore</id>
    <content type="html">&lt;p&gt;A year ago I decided to try my hand on iPhone software development and created a very simple application to experience the whole lifecycle of putting a complete project on the Apple AppStore - &lt;a href="http://www.leonardoborges.com/writings/2011/03/19/rottingnames-for-iphone-available-for-free/"&gt;I wrote about it a while back&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The result was &lt;a href="http://itunes.apple.com/au/app/rottingnames/id413043377?mt=8"&gt;RottingNames&lt;/a&gt;, a heavy metal band name generator.&lt;/p&gt;

&lt;p&gt;Since then, I haven&amp;#8217;t developed anything else for the iPhone - mostly because my interest lies elsewhere now - but I did notice a small yet steady amount of downloads for this cool little app.&lt;/p&gt;

&lt;p&gt;You can download &lt;a href="http://itunes.apple.com/au/app/rottingnames/id413043377?mt=8"&gt;RottingNames&lt;/a&gt; for free from the App Store and I like keeping it that way.&lt;/p&gt;

&lt;p&gt;However, to be able to put an application on the AppStore, Apple charges an annual fee of A$99 - even if the application itself is free.&lt;/p&gt;

&lt;p&gt;I had decided not to renew my iOS Developer Program membership but it seems a pity to let RottingNames vanish like this. Es pecially knowing there are a few die-hard fans out there having a good laugh with it.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the deal: I&amp;#8217;m asking for A$99 in order to renew the membership.&lt;/p&gt;

&lt;p&gt;In return, RottingNames will stay on the AppStore for another year, for free.&lt;/p&gt;

&lt;p&gt;So hit the button below and stay metal! \m/&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.pledgie.com/campaigns/16403'&gt;&lt;img alt='Click here to lend your support to: Help keep RottingNames on the AppStore and make a donation at www.pledgie.com !' src='http://www.pledgie.com/campaigns/16403.png?skin_name=chrome' border='0' /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/xcIPst4vrzU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2011/12/07/help-keep-rottingnames-on-the-appstore/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[RubyConf Brazil 2011]]></title>
    <link href="http://feedproxy.google.com/~r/leonardoborges/~3/MG-o4-zzsrg/" />
    <updated>2011-11-10T00:00:00+11:00</updated>
    <id>http://www.leonardoborges.com/writings/2011/11/10/rubyconf-brazil-2011</id>
    <content type="html">&lt;p&gt;&lt;img src="http://www.leonardoborges.com/writings/assets/images/rubyconfBR2011-speakers.jpg"&gt;&lt;/p&gt;

&lt;p&gt;I was in São Paulo last week - the 3rd and 4th of November - for &lt;a href="http://rubyconf.com.br"&gt;RubyConf Brazil&lt;/a&gt;. For those who don&amp;#8217;t know, RubyConf Brazil is the evolution of Rails Summit Latin America, where &lt;a href="http://www.leonardoborges.com/writings/2009/10/18/my-slides-from-rails-summit-09/"&gt;I had the privilege to speak in 2009&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This year though, all bets were off. &lt;a href="http://akitaonrails.com"&gt;Fabio Akita&lt;/a&gt; and &lt;a href="http://www.locaweb.com/"&gt;Locaweb&lt;/a&gt; put together a great event, with over 700 attendees and about 30 speakers split in two streams and two awesome days.&lt;/p&gt;

&lt;p&gt;Once more I had the chance to speak at the event and different from previous years, all talks were recorded and streamed live! You can check mine - in portuguese - &lt;a href="http://www.eventials.com/rubyconfbr/recorded/M2UzZTJkMzY2MzdiNTg2NTUxNWM1MzI3NWY1YjRhMzYjIzM4Mg_3D_3D"&gt;here&lt;/a&gt; as well as my slides - in english - &lt;a href="http://www.slideshare.net/borgesleonardo/clouds-against-the-floods-rubyconfbr2011"&gt;on slideshare&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.leonardoborges.com/writings/assets/images/leo-speaking-rubyconfBR2011.jpg"&gt;&lt;/p&gt;

&lt;p&gt;All other talks can be watched from the &lt;a href="http://www.eventials.com/rubyconfbr"&gt;eventials&amp;#8217; RubyConf Brazil page&lt;/a&gt;. Locaweb has also published the official &lt;a href="http://www.flickr.com/photos/locaweb/sets/72157628091808954/"&gt;Flickr album&lt;/a&gt; of the event.&lt;/p&gt;

&lt;p&gt;It was great to meet up with great friends again as well as to meet amazing new people such as the guys from ThoughtWorks Brazil. I promise I&amp;#8217;ll make the detour next time! :)&lt;/p&gt;

&lt;p&gt;I hope to see you all again soon!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/leonardoborges/~4/MG-o4-zzsrg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.leonardoborges.com/writings/2011/11/10/rubyconf-brazil-2011/</feedburner:origLink></entry>
  
</feed>
