<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Looped Strange]]></title>
  <link href="blog.jordanwest.me/atom.xml" rel="self"/>
  <link href="blog.jordanwest.me/"/>
  <updated>2012-05-08T14:27:21-07:00</updated>
  <id>blog.jordanwest.me/</id>
  <author>
    <name><![CDATA[Jordan West]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[The RiakOperation[T] Monad]]></title>
    <link href="blog.jordanwest.me/blog/2012/05/05/the-riakoperation-t-monad/"/>
    <updated>2012-05-05T15:32:00-07:00</updated>
    <id>blog.jordanwest.me/blog/2012/05/05/the-riakoperation-t-monad</id>
    <content type="html"><![CDATA[<p>Last week <a href="http://www.stackmob.com">we</a> released <a href="https://github.com/stackmob/scaliak">Scaliak</a>, a client library for Riak written in Scala. We received a lot of good feedback from its release. On the other hand, there were some who were critical about its use of <a href="https://github.com/scalaz/scalaz">Scalaz</a> &amp; the <code>IO</code> monad. What struck me as interesting about that is if you are using the <a href="https://github.com/basho/riak-java-client">Riak Java Client</a> then you&#8217;ve been using a more specific version of the <code>IO</code> monad, <code>RiakOperation&lt;T&gt;</code>, all along. The primary differences are that monadic capabilities aren&#8217;t exposed in the Riak Java Client, but are easy to add, and the <code>IO</code> monad is more generic.</p>

<p>It&#8217;s not uncommon for blog posts about monads to say something like, &#8220;monads are cool because you have been using them all along and you didn&#8217;t even know it, and once you know it the world gets even more awesome.&#8221; I prefer to try to make this argument along the lines of, &#8220;monads are cool because you have had the potential to use them all along and when you recognize &amp; leverage them in the structures you are using, your code gets better and then the world gets even more awesome.&#8221; Saying &#8220;your code gets better&#8221; is a broad statement, I know, but I will be expanding on that throughout this post.</p>

<p>Using the monad for <code>RiakOperation[T]</code> we can chain together operations without having to call <code>execute()</code> (performing the side-effect) until the chain has been completely constructed. This gives us greater control of the side-effects our application performs.</p>

<!-- more -->


<p>The meat of the code in this post will be written in Scala, because I am more familiar with and prefer it, but it can be done in Java. In case you haven&#8217;t seen the Riak Java Client before, here is its original definition:</p>

<figure class='code'><figcaption><span>RiakOperation </span><a href='https://github.com/basho/riak-java-client/blob/master/src/main/java/com/basho/riak/client/operations/RiakOperation.java'>link</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">RiakOperation</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">T</span> <span class="nf">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">RiakException</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>RiakOperations Do Not Compose (Yet)</h2>

<p>Once we have implemented the monad instance for <code>RiakOperation[T]</code> we will be able to <em>compose</em> instances. Composition is a much larger subject but specific to this case it means the ability to build up a <code>RiakOperation[T]</code> that, when we finally call <code>execute()</code> on it, runs all of its parts returning a final value of type <code>T</code>. Here is a quick example of why we can&#8217;t do this (yet). Say we want to create a bucket, store a value at a key, and then fetch a key in that bucket. This requires three instances of <code>RiakOperation[T]</code>, one <code>WriteBucket</code>, one <code>WriteObject[T]</code> and one <code>FetchObject[T]</code>. From the <a href="https://github.com/basho/riak-java-client/blob/master/README.org">README</a> we can see how to do this:</p>

<figure class='code'><figcaption><span>From the Quick Start Section </span><a href='https://github.com/basho/riak-java-client/blob/master/README.org'>link</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="c1">// create a new bucket</span>
</span><span class='line'><span class="nc">Bucket</span> <span class="n">myBucket</span> <span class="k">=</span> <span class="n">riakClient</span><span class="o">.</span><span class="n">createBucket</span><span class="o">(</span><span class="s">&quot;myBucket&quot;</span><span class="o">).</span><span class="n">execute</span><span class="o">();</span>
</span><span class='line'><span class="c1">// add data to the bucket</span>
</span><span class='line'><span class="n">myBucket</span><span class="o">.</span><span class="n">store</span><span class="o">(</span><span class="s">&quot;key1&quot;</span><span class="o">,</span> <span class="s">&quot;value1&quot;</span><span class="o">).</span><span class="n">execute</span><span class="o">();</span>
</span><span class='line'><span class="c1">//fetch it back</span>
</span><span class='line'><span class="nc">IRiakObject</span> <span class="n">myData</span> <span class="k">=</span> <span class="n">myBucket</span><span class="o">.</span><span class="n">fetch</span><span class="o">(</span><span class="s">&quot;key1&quot;</span><span class="o">).</span><span class="n">execute</span><span class="o">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order to fetch and store data from a bucket we needed a reference to a bucket itself, which required a call to <code>execute()</code>. In real code, we would have wrapped either that entire thing in a <code>try/catch</code> or wrapped each component part, perhaps putting some of them behind our own methods for clarity. In the former case, however, we are directly preventing composition. Another exception handling block is required if we then want to fetch or create a bucket and perform some map/reduce functions on it. In the latter case, we are adding code to allow us to use the pieces more easily. However, in both cases, this isn&#8217;t composition, its just simply writing more code. Code written this way in a real application gets unwieldy, verbose and harder to test over time.</p>

<p>The primary benefit of composition is we can control when all of the actions happen, since we execute them all in one call, as opposed to forcing them to happen individually. This has far-reaching implications both in our application&#8217;s source and its tests. Pure code is more reuseable and as a result we write less of it. We don&#8217;t have to write extra exception handling blocks or duplicate logic. In tests, having full control over when side-effects happen makes writing and reasoning about those tests much easier.</p>

<h2>Making RiakOperation Composeable</h2>

<p>In order to make <code>RiakOperation[T]</code> composeable we need to implement the necessary functions that define the monad instance. To do this begs the question, if you are not familiar with the answer, &#8220;What is a Monad?&#8221; I won&#8217;t pretend to the be the authority on this as its a subject I still work on learning &amp; understanding everyday and I won&#8217;t give a clinical definition here. You may find <a href="http://dl.dropbox.com/u/7810909/docs/what-does-monad-mean/chunk-html/index.html">this</a> to be a good resource to start. The way I like to think of monads is they allow us to chain operations together where operations in the chain may depend on the previous ones. There is more to monads than this but it&#8217;s enough to explore our topic, <code>RiakOperation[T]</code>. We want to be able to chain <code>RiakOperation[T]</code>s together when some of the calls depend on previous ones returning a new <code>RiakOperation[T]</code>. Only at the end, not at any intermediate point in the construction of the chain, do we call <code>execute()</code>. If an exception is thrown somewhere in the chain after <code>execute()</code> is called, execution stops.</p>

<p>To implement the monad instance we will use <a href="https://github.com/scalaz/scalaz/tree/scalaz-seven">Scalaz7</a> and its <code>Monad[M[_]]</code> type class. We will need to provide implementations for two functions: <code>bind[A,B](ra: RiakOperation[A])(f: A =&gt; RiakOperation[B]): RiakOperation[B]</code>, commonly called <code>flatMap</code> in Scala, and <code>point(a: =&gt; A): RiakOperation[A]</code>, which takes any simple value of type <code>A</code> and <em>lifts</em> it into the monad. <code>bind</code> allows us to compose <code>RiakOperation[T]</code> instances and <code>point</code> makes it possible to take simple values and use them within the <code>RiakOperation[T]</code> that we build up.</p>

<figure class='code'><figcaption><span>What Needs to be Implemented</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">import</span> <span class="nn">com.basho.riak.client.operations.RiakOperation</span>
</span><span class='line'><span class="k">import</span> <span class="nn">scalaz.Monad</span>
</span><span class='line'>
</span><span class='line'><span class="k">object</span> <span class="nc">RiakOperationW</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">implicit</span> <span class="k">def</span> <span class="n">riakOpMonad</span><span class="o">[</span><span class="kt">T</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Monad</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">def</span> <span class="n">point</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="o">=&gt;</span> <span class="n">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="o">...</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="n">bind</span><span class="o">[</span><span class="kt">A</span>,<span class="kt">B</span><span class="o">](</span><span class="n">ra</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="nc">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">])</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">]</span> <span class="k">=</span> <span class="o">...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Before we look at the implementation, lets see the result. Scalaz7 allows for <a href="https://github.com/scalaz/scalaz/tree/scalaz-seven#standalone-type-class-usage">Standalone Type Class Usage</a> which helps reduce the cognitive load in seeing how things work at the cost of some prettier syntax. We will use that method now and explore nicer syntax and use of for-comprehensions later. To work through our example we need to import some packages from the Riak Java Client, as well as <code>scalaz.Monad</code>, and our implicit <code>Monad[RiakOperation]</code> instance:</p>

<figure class='code'><figcaption><span>What Needs to be Implemented</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">import</span> <span class="nn">com.basho.riak.client._</span>
</span><span class='line'><span class="k">import</span> <span class="nn">bucket._</span>
</span><span class='line'><span class="k">import</span> <span class="nn">operations._</span>
</span><span class='line'><span class="k">import</span> <span class="nn">scalaz.Monad</span>
</span><span class='line'><span class="k">import</span> <span class="nn">RiakOperationW._</span>
</span></code></pre></td></tr></table></div></figure>


<p>We will then get an instance of a Riak Client (in this case, over HTTP and connected to a single node, but it doesn&#8217;t matter):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">val</span> <span class="n">riakClient</span> <span class="k">=</span> <span class="nc">RiakFactory</span><span class="o">.</span><span class="n">httpClient</span><span class="o">(</span><span class="s">&quot;http://localhost:8091/riak&quot;</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We, also, need the standalone Monad instance for <code>RiakOperation</code>, <code>Monad[RiakOperation]</code>. <em>Note: You may have noticed above that we write <code>Monad[RiakOperation]</code> and not <code>Monad[RiakOperation[T]]</code>. That is because the type parameter for <code>Monad[M[_]]</code>, takes one type parameter. Or <code>M[_]</code> is a type function of one argument. We get a concrete <code>RiakOperation[T]</code> using the type parameters in <code>point</code> and <code>bind</code>, applying them to the type function.</em></p>

<figure class='code'><figcaption><span>Getting the RiakOperation Monad Instance</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">val</span> <span class="n">M</span><span class="k">:</span> <span class="kt">Monad</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Monad</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>With a reference to the instance, we can chain operations together and lift pure values into operations:</p>

<figure class='code'><figcaption><span>Lifting and Composing</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">val</span> <span class="n">bucketName</span> <span class="k">=</span> <span class="s">&quot;test-bucket&quot;</span>
</span><span class='line'><span class="k">val</span> <span class="n">bucketNameOp</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="k">=</span> <span class="n">M</span><span class="o">.</span><span class="n">point</span><span class="o">(</span><span class="n">bucketName</span><span class="o">)</span>
</span><span class='line'><span class="k">val</span> <span class="n">fetchBucket</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">Bucket</span><span class="o">]</span> <span class="k">=</span> <span class="n">M</span><span class="o">.</span><span class="n">bind</span><span class="o">(</span><span class="n">bucketNameOp</span><span class="o">){</span>
</span><span class='line'>  <span class="o">(</span><span class="n">s</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">riakClient</span><span class="o">.</span><span class="n">fetchBucket</span><span class="o">(</span><span class="n">s</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, we take a string value and <em>lift</em> it into <code>RiakOperation[String]</code>. We then compose that operation with a <code>FetchBucket</code> operation, a <code>RiakOperation[Bucket]</code>, using the string that will be returned from the former as an argument to the latter (the latter depends on a previous operation). We haven&#8217;t called <code>execute()</code> still so we have preserved the <code>RiakOperation[T]</code> structure and have not made a real HTTP call or received a real reference to the bucket yet. Before we call execute we can continue to build more operations, like one to store a key/value pair in the bucket and another to fetch:</p>

<figure class='code'><figcaption><span>More Composition</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">val</span> <span class="n">fetchKey</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">]</span> <span class="k">=</span> <span class="n">M</span><span class="o">.</span><span class="n">bind</span><span class="o">(</span><span class="n">fetchBucket</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="o">(</span><span class="n">b</span><span class="k">:</span> <span class="kt">Bucket</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">b</span><span class="o">.</span><span class="n">fetch</span><span class="o">(</span><span class="s">&quot;key&quot;</span><span class="o">))</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="k">val</span> <span class="n">storeKey</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">]</span> <span class="k">=</span> <span class="n">M</span><span class="o">.</span><span class="n">bind</span><span class="o">(</span><span class="n">fetchBucket</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="o">(</span><span class="n">b</span><span class="k">:</span> <span class="kt">Bucket</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">b</span><span class="o">.</span><span class="n">store</span><span class="o">(</span><span class="s">&quot;key&quot;</span><span class="o">,</span> <span class="s">&quot;value&quot;</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It doesn&#8217;t matter in what order we define <code>fetchKey</code> and <code>storeKey</code> because they haven&#8217;t actually executed anything against the database yet. Its not until we call <code>execute()</code> that anything will happen.</p>

<figure class='code'><figcaption><span>Executing the Composed Operations</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="n">scala</span><span class="o">&gt;</span> <span class="n">fetchKey</span><span class="o">.</span><span class="n">execute</span><span class="o">()</span>
</span><span class='line'><span class="n">res5</span><span class="k">:</span> <span class="kt">com.basho.riak.client.IRiakObject</span> <span class="o">=</span> <span class="kc">null</span>
</span><span class='line'>
</span><span class='line'><span class="n">scala</span><span class="o">&gt;</span> <span class="n">storeKey</span><span class="o">.</span><span class="n">execute</span><span class="o">()</span>
</span><span class='line'><span class="n">res6</span><span class="k">:</span> <span class="kt">com.basho.riak.client.IRiakObject</span> <span class="o">=</span> <span class="kc">null</span>
</span><span class='line'>
</span><span class='line'><span class="n">scala</span><span class="o">&gt;</span> <span class="n">fetchKey</span><span class="o">.</span><span class="n">execute</span><span class="o">()</span>
</span><span class='line'><span class="n">res7</span><span class="k">:</span> <span class="kt">com.basho.riak.client.IRiakObject</span> <span class="o">=</span> <span class="n">com</span><span class="o">.</span><span class="n">basho</span><span class="o">.</span><span class="n">riak</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="nc">DefaultRiakObject</span><span class="o">@</span><span class="mi">26151</span><span class="n">aae</span>
</span></code></pre></td></tr></table></div></figure>


<p>This was a pretty simple example but, if we had something more realistic, writing code this way could get rather sphagetti-like. That&#8217;s why the syntax extensions from Scalaz7 and the ability to use the monad in for-comprehensions, that we will discuss later, is convenient.</p>

<p>Lets switch back to the implementation though. The easier and more obvious implementation is <code>point</code>. To implement <code>point</code> means we are <em>lifting</em> a value of type <code>A</code> into a <code>RiakOperation[A]</code>, which basically means that value is returned when we call <code>execute()</code> on that operation.</p>

<figure class='code'><figcaption><span>point</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">def</span> <span class="n">point</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">a</span><span class="k">:</span> <span class="kt">A</span><span class="o">)</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">RiakOperation</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="o">{</span>
</span><span class='line'>   <span class="k">def</span> <span class="n">execute</span><span class="o">()</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=</span> <span class="n">a</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Easy enough. Now onto <code>bind</code>. This implementation is a little tricky at first but, once you know it, its rather obvious. When we call <code>bind</code> we pass in an initial operation of type <code>RiakOperation[A]</code>, <code>ra</code> below, and a function <code>A =&gt; RiakOperation[B]</code>. In order to get that value of type <code>A</code> out of the <code>RiakOperation</code> we must call <code>execute</code> on it, but we don&#8217;t want that call to happen until we call <code>execute</code> on the result returned from <code>bind</code>. Next we pass that value of type <code>A</code> into the provided function returning a new <code>RiakOperation[B]</code>. Our result is a <code>RiakOperation[B]</code> that when <code>execute()</code> is called returns what would have been returned by the <code>RiakOperation[B]</code> returned by the function had we called <code>execute()</code> on it. This leads to the following definition:</p>

<figure class='code'><figcaption><span>bind</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">def</span> <span class="n">bind</span><span class="o">[</span><span class="kt">A</span>,<span class="kt">B</span><span class="o">](</span><span class="n">ra</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="nc">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">])</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">]</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">]</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">def</span> <span class="n">execute</span><span class="o">()</span><span class="k">:</span> <span class="kt">B</span> <span class="o">=</span> <span class="n">f</span><span class="o">(</span><span class="n">ra</span><span class="o">.</span><span class="n">execute</span><span class="o">()).</span><span class="n">execute</span><span class="o">()</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Simpler, we can just write this as:</p>

<figure class='code'><figcaption><span>bind</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">def</span> <span class="n">bind</span><span class="o">[</span><span class="kt">A</span>,<span class="kt">B</span><span class="o">](</span><span class="n">ra</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">A</span><span class="o">])(</span><span class="n">f</span><span class="k">:</span> <span class="kt">A</span> <span class="o">=&gt;</span> <span class="nc">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">])</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">B</span><span class="o">]</span> <span class="k">=</span> <span class="n">f</span><span class="o">(</span><span class="n">ra</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s it. We have implemented the <code>Monad[RiakOperation]</code> instance. With that simple bit of code we are able to chain operations together, or compose them, giving more control over the side-effects they perform. In addition, we can leverage all of the other functions provided via the Monad library, defined as part of Scalaz.</p>

<h2>The Prettier Syntax</h2>

<p>By importing <code>scalaz.syntax._</code> we get a nice set of syntax extensions we can use with our new monad instance. For example, we can write the above standalone type class examples with a more &#8220;object-oriented feel&#8221; to them.</p>

<figure class='code'><figcaption><span>Using Scalaz Syntax Extensions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">val</span> <span class="n">bucketName</span> <span class="k">=</span> <span class="s">&quot;test-bucket&quot;</span>
</span><span class='line'><span class="k">val</span> <span class="n">fetchBucket</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">Bucket</span><span class="o">]</span> <span class="k">=</span> <span class="n">bucketName</span><span class="o">.</span><span class="n">point</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span> <span class="n">flatMap</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">riakClient</span><span class="o">.</span><span class="n">fetchBucket</span><span class="o">(</span><span class="n">_</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="k">val</span> <span class="n">fetchKey</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">]</span> <span class="k">=</span> <span class="n">fetchBucket</span> <span class="n">flatMap</span> <span class="o">{</span> <span class="n">_</span><span class="o">.</span><span class="n">fetch</span><span class="o">(</span><span class="s">&quot;key&quot;</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'><span class="k">val</span> <span class="n">storeKey</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">]</span> <span class="k">=</span> <span class="n">fetchBucket</span> <span class="n">flatMap</span> <span class="o">{</span> <span class="n">_</span><span class="o">.</span><span class="n">store</span><span class="o">(</span><span class="s">&quot;key&quot;</span><span class="o">,</span> <span class="s">&quot;value&quot;</span><span class="o">)</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can also use <code>RiakOperation[T]</code>s in for-comprehensions now, allowing us to more cleanly express the closure that is created as we chain multiple ones together.</p>

<figure class='code'><figcaption><span>Using For-Comprehensions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">val</span> <span class="n">op1</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">]</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">bn</span> <span class="k">&lt;-</span> <span class="n">bucketName</span><span class="o">.</span><span class="n">point</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span>
</span><span class='line'>  <span class="n">k</span> <span class="k">&lt;-</span> <span class="s">&quot;key&quot;</span><span class="o">.</span><span class="n">point</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span>
</span><span class='line'>  <span class="n">b</span> <span class="k">&lt;-</span> <span class="n">riakClient</span><span class="o">.</span><span class="n">fetchBucket</span><span class="o">(</span><span class="n">bn</span><span class="o">)</span>
</span><span class='line'>  <span class="k">_</span> <span class="k">&lt;-</span> <span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="n">store</span><span class="o">(</span><span class="n">k</span><span class="o">,</span> <span class="s">&quot;value&quot;</span><span class="o">)</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">])</span>
</span><span class='line'>  <span class="n">v</span> <span class="k">&lt;-</span> <span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="n">fetch</span><span class="o">(</span><span class="n">k</span><span class="o">)</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">])</span>
</span><span class='line'><span class="o">}</span> <span class="k">yield</span> <span class="n">v</span>
</span><span class='line'>
</span><span class='line'><span class="k">val</span> <span class="n">op2</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">Bucket</span><span class="o">]</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">bn</span> <span class="k">&lt;-</span> <span class="n">bucketName</span><span class="o">.</span><span class="n">point</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span>
</span><span class='line'>  <span class="n">k</span> <span class="k">&lt;-</span> <span class="s">&quot;key&quot;</span><span class="o">.</span><span class="n">point</span><span class="o">[</span><span class="kt">RiakOperation</span><span class="o">]</span>
</span><span class='line'>  <span class="n">b</span> <span class="k">&lt;-</span> <span class="n">riakClient</span><span class="o">.</span><span class="n">fetchBucket</span><span class="o">(</span><span class="n">bn</span><span class="o">)</span>
</span><span class='line'>  <span class="k">_</span> <span class="k">&lt;-</span> <span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="n">store</span><span class="o">(</span><span class="n">k</span><span class="o">,</span> <span class="s">&quot;value&quot;</span><span class="o">)</span><span class="k">:</span> <span class="kt">RiakOperation</span><span class="o">[</span><span class="kt">IRiakObject</span><span class="o">])</span>
</span><span class='line'><span class="o">}</span> <span class="k">yield</span> <span class="n">b</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Part 2</h2>

<p>In the for-comprehension, the type annotations are necessary to help along the Scala type-inferencer and is one of the reasons I chose to use the <code>IO</code> monad in Scala instead of implementing <code>Monad[RiakOperation]</code>. I plan to cover this in more detail in a subsequent post.</p>

<p>To close, I found this comment interesting when perusing the <a href="https://github.com/basho/riak-java-client/blob/master/src/main/java/com/basho/riak/client/operations/RiakOperation.java"><code>RiakOperation</code> source</a>, &#8220;Just like <code>Callable</code>, hey, wait, maybe it <em>should</em> just be replaced with <code>Callable</code>&#8221;. Scalaz defines a monad instance for <code>Callable</code>s.</p>
]]></content>
  </entry>
  
</feed>

