<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>

<channel>
<title>Scala Neophyte</title>
<link>http://danielwestheide.com</link>
<description>Scala Neophyte</description>

<item>
<title>The Neophyte&#x27;s Guide to Scala Part 12: Type classes - Daniel Westheide</title>
<link>http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html</link>
<description>&#x3C;div class=&#x22;entry-content&#x22;&#x3E;&#x3C;p&#x3E;After having discussed several functional programming techniques for keeping things DRY and flexible in the last two weeks, in particular function composition, partial function application, and currying, we are going to stick with the general notion of making your code as flexible as possible.&#x3C;/p&#x3E;&#x3C;p&#x3E;However, this time, we are not looking so much at how you can leverage functions as first-class objects to achieve this goal. Instead, this article is all about using the type system in such a manner that it&#x2019;s not in the way, but rather supports you in keeping your code extensible: You&#x2019;re going to learn about &#x3C;em&#x3E;type classes&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;You might think that this is some exotic idea without practical relevance, brought into the Scala community by some vocal Haskell fanatics. This is clearly not the case. Type classes have become an important part of the Scala standard library and even more so of many popular and commonly used third-party open-source libraries, so it&#x2019;s generally a good idea to make yourself familiar with them.&#x3C;/p&#x3E;&#x3C;p&#x3E;I will discuss the idea of type classes, why they are useful, how to benefit from them as a client, and how to implement your own type classes and put them to use for great good.&#x3C;/p&#x3E;&#x3C;h2&#x3E;The problem&#x3C;/h2&#x3E;&#x3C;p&#x3E;Instead of starting off by giving an abstract explanation of what type classes are, let&#x2019;s tackle this subject by means of an &#x2013; admittedly simplified, but nevertheless resonably practical &#x2013; example.&#x3C;/p&#x3E;&#x3C;p&#x3E;Imagine that we want to write a fancy statistics library. This means we want to provide a bunch of functions that operate on collections of numbers, mostly to compute some aggregate values for them. Imagine further that we are restricted to accessing an element from such a collection by index and to using the &#x3C;code&#x3E;reduce&#x3C;/code&#x3E; method defined on Scala collections. We impose this restriction on ourselves because we are going to re-implement a little bit of what the Scala standard library already provides &#x2013; simply because it&#x2019;s a nice example without many distractions, and it&#x2019;s small enough for a blog post. Finally, our implementation assumes that the values we get are already sorted.&#x3C;/p&#x3E;&#x3C;p&#x3E;We will start with a very crude implementation of &#x3C;code&#x3E;median&#x3C;/code&#x3E;, &#x3C;code&#x3E;quartiles&#x3C;/code&#x3E;, and &#x3C;code&#x3E;iqr&#x3C;/code&#x3E; numbers of type &#x3C;code&#x3E;Double&#x3C;/code&#x3E;:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Statistics&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;*&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;3&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;iqr&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;match&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lowerQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;upperQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;upperQuartile&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;lowerQuartile&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reduce&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;The median cuts a data set in half, whereas the lower and upper quartile (first and third element of the tuple returned by our &#x3C;code&#x3E;quartile&#x3C;/code&#x3E; method), split the lowest and highest 25 percent of the data, respectively. Our &#x3C;code&#x3E;iqr&#x3C;/code&#x3E; method returns the interquartile range, which is the difference between the upper and lower quartile.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, of course, we want to support more than just double numbers. So let&#x2019;s implement all these methods again for &#x3C;code&#x3E;Int&#x3C;/code&#x3E; numbers, right?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well, no! First of all, we can&#x2019;t simply overload the methods defined above for &#x3C;code&#x3E;Vector[Int]&#x3C;/code&#x3E; without some dirty tricks, because the type parameter suffers from &#x3C;em&#x3E;type erasure&#x3C;/em&#x3E;. Also, that would be a tiny little bit repetitious, wouldn&#x2019;t it?&#x3C;/p&#x3E;&#x3C;p&#x3E;If only &#x3C;code&#x3E;Int&#x3C;/code&#x3E; and &#x3C;code&#x3E;Double&#x3C;/code&#x3E; would extend from a common base class or implement a common trait like &#x3C;code&#x3E;Number&#x3C;/code&#x3E;! We could be tempted to change the type required and returned by our methods to that more general type. Our method signatures would look like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Statistics&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;???&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;???&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;iqr&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;???&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Number&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;???&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Thankfully, in this case there is no such common trait, so we aren&#x2019;t tempted to walk this road at all. However, in other cases, that might very well be the case &#x2013; and still be a bad idea. Not only do we drop previously available type information, we also close our API against future extensions to types whose sources we don&#x2019;t control: We cannot make some new number type coming from a third party extend the &#x3C;code&#x3E;Number&#x3C;/code&#x3E; trait.&#x3C;/p&#x3E;&#x3C;p&#x3E;Ruby&#x2019;s answer to that problem is &#x3C;em&#x3E;monkey patching&#x3C;/em&#x3E;, polluting the global namespace with an extension to that new type, making it act like a &#x3C;code&#x3E;Number&#x3C;/code&#x3E; after all. Java developers who have got beaten up by the Gang of Four in their youth, on the other hand, will think that an &#x3C;em&#x3E;Adapter&#x3C;/em&#x3E; may solve all of their problems:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;20&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;21&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;22&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;23&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Statistics&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeDouble&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeDouble&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeDouble&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeDouble&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;type&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Quartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Quartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;*&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;3&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;iqr&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;match&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lowerQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;upperQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;upperQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lowerQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;A&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reduce&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now we have solved the problem of extensibility: Users of our library can pass in a &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; adapter for &#x3C;code&#x3E;Int&#x3C;/code&#x3E; (which we would likely provide ourselves) or for any possible type that might behave like a number, without having to recompile the module in which our statistics methods are implemented.&#x3C;/p&#x3E;&#x3C;p&#x3E;However, always wrapping your numbers in an adapter is not only tiresome to write and read, it also means that you have to create a lot of instances of your adapter classes when interacting with our library.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Type classes to the rescue!&#x3C;/h2&#x3E;&#x3C;p&#x3E;A powerful alternative to the approaches outlined so far is, of course, to define and use a type class. Type classes, one of the prominent features of the Haskell language, despite their name, haven&#x2019;t got anything to do with classes in object-oriented programming.&#x3C;/p&#x3E;&#x3C;p&#x3E;A type class &#x3C;code&#x3E;C&#x3C;/code&#x3E; defines some behaviour in the form of operations that must be supported by a type &#x3C;code&#x3E;T&#x3C;/code&#x3E; for it to be a member of type class &#x3C;code&#x3E;C&#x3C;/code&#x3E;. Whether the type &#x3C;code&#x3E;T&#x3C;/code&#x3E; is a member of the type class &#x3C;code&#x3E;C&#x3C;/code&#x3E; is not inherent in the type. Rather, any developer can declare that a type is a member of a type class simply by providing implementations of the operations the type must support. Now, once &#x3C;code&#x3E;T&#x3C;/code&#x3E; is made a member of the type class &#x3C;code&#x3E;C&#x3C;/code&#x3E;, functions that have constrained one or more of their parameters to be members of &#x3C;code&#x3E;C&#x3C;/code&#x3E; can be called with arguments of type &#x3C;code&#x3E;T&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;As such, type classes allow ad-hoc and retroactive polymorphism. Code that relies on type classes is open to extension without the need to create adapter objects.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Creating a type class&#x3C;/h3&#x3E;&#x3C;p&#x3E;In Scala, type classes can be implemented and used by a combination of techniques. It&#x2019;s a little more involved than in Haskell, but also gives developers more control.&#x3C;/p&#x3E;&#x3C;p&#x3E;Creating a type class in Scala involves several steps. First, let&#x2019;s define a trait. This is the actual type class:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Math&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;We have created a type class called &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E;. Type classes always take one or more type parameters, and they are usually designed to be stateless, i.e. the methods defined on our &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; trait operate only on the passed in arguments. In particular, where our adapter above operated on its member of type &#x3C;code&#x3E;T&#x3C;/code&#x3E; and one argument, the methods defined for our &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; type class take two parameters of type &#x3C;code&#x3E;T&#x3C;/code&#x3E; each &#x2013; the member has become the first parameter of the operations supported by &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Providing default members&#x3C;/h3&#x3E;&#x3C;p&#x3E;The second step in implementing a type class is usually to provide some default implementations of your type class trait in its companion object. We will see in a moment why this is generally a good strategy. First, however, let&#x2019;s do this, too, by making &#x3C;code&#x3E;Double&#x3C;/code&#x3E; and &#x3C;code&#x3E;Int&#x3C;/code&#x3E; members of our &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; type class:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Math&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeDouble&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeInt&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Two things: First, you see that the two implementations are basically identical. That is not always the case when creating members of a type classes. Our &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; type class is just a rather narrow domain. Later in the article, I will give examples of type classes where there is a lot less room for duplication when implementing them for multiple types. Second, please ignore the fact that we are losing precision in &#x3C;code&#x3E;NumberLikeInt&#x3C;/code&#x3E; by doing integer division. It&#x2019;s all to keep things simple for this example.&#x3C;/p&#x3E;&#x3C;p&#x3E;As you can see, members of type classes are usually singleton objects. Also, please note the &#x3C;code&#x3E;implicit&#x3C;/code&#x3E; keyword before each of the type class implementations. This is one of the crucial elements for making type classes possible in Scala, making type class members implicitly available under certain conditions. More about that in the next section.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Coding against type classes&#x3C;/h3&#x3E;&#x3C;p&#x3E;Now that we have our type class and two default implementations for common types, we want to code against this type class in our statistics module. Let&#x2019;s focus on the &#x3C;code&#x3E;mean&#x3C;/code&#x3E; method for now:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Statistics&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Math.NumberLike&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;ev&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;ev&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reduce&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;ev&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;This may look a little intimidating at first, but it&#x2019;s actually quite simple. Our method takes a type parameter &#x3C;code&#x3E;T&#x3C;/code&#x3E; and a single parameter of type &#x3C;code&#x3E;Vector[T]&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;The idea to constrain a parameter to types that are members of a specific type class is realized by means of the &#x3C;code&#x3E;implicit&#x3C;/code&#x3E; second parameter list. What does this mean? Basically, that a value of type &#x3C;code&#x3E;NumberLike[T]&#x3C;/code&#x3E; must be implicitly available in the current scope. This is the case if an &#x3C;em&#x3E;implicit value&#x3C;/em&#x3E; has been declared and made available in the current scope, very often by importing the package or object in which that implicit value is defined.&#x3C;/p&#x3E;&#x3C;p&#x3E;If and only if no other implicit value can be found, the compiler will look in the companion object of the type of the implicit parameter. Hence, as a library designer, putting your default type class implementations in the companion object of your type class trait means that users of your library can easily override these implementations with their own ones, which is exactly what you want. Users can also pass in an explicit value for an implicit parameter to override the implicit values that are in scope.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s see if the default type class implementations can be resolved:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;numbers&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Double&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;13&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mf&#x22;&#x3E;23.0&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;42&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;45&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;61&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;73&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;96&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;100&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;199&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;420&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;900&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;3839&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Statistics&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;numbers&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Wonderful! If we try this with a &#x3C;code&#x3E;Vector[String]&#x3C;/code&#x3E;, we get an error at compile time, stating that no implicit value could be found for parameter &#x3C;code&#x3E;ev: NumberLike[String]&#x3C;/code&#x3E;. If you don&#x2019;t like this error message, you can customize it by annotating your type class trait with the &#x3C;code&#x3E;@implicitNotFound&#x3C;/code&#x3E; annotation:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Math&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;annotation.implicitNotFound&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;nd&#x22;&#x3E;@implicitNotFound&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;No member of type class NumberLike in scope for ${T}&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;h4&#x3E;Context bounds&#x3C;/h4&#x3E;&#x3C;p&#x3E;A second, implicit parameter list on all methods that expect a member of a type class can be a little verbose. As a shortcut for implicit parameters with only one type parameter, Scala provides so-called &#x3C;em&#x3E;context bounds&#x3C;/em&#x3E;. To show how those are used, we are going to implement our other statistics methods using those instead:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Statistics&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Math.NumberLike&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;ev&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;ev&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reduce&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;ev&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;median&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;size&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;*&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;3&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;iqr&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;])&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quartiles&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;xs&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;match&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lowerQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;upperQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;implicitly&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;T&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]].&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;upperQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;lowerQuartile&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;A context bound &#x3C;code&#x3E;T : NumberLike&#x3C;/code&#x3E; means that an implicit value of type &#x3C;code&#x3E;NumberLike[T]&#x3C;/code&#x3E; must be available, and so is really equivalent to having a second implicit parameter list with a &#x3C;code&#x3E;NumberLike[T]&#x3C;/code&#x3E; in it. If you want to access that implicitly available value, however, you need to call the &#x3C;code&#x3E;implicitly&#x3C;/code&#x3E; method, as we do in the &#x3C;code&#x3E;iqr&#x3C;/code&#x3E; method. If your type class requires more than one type parameter, you cannot use the context bound syntax.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Custom type class members&#x3C;/h3&#x3E;&#x3C;p&#x3E;As a user of a library that makes use of type classes, you will sooner or later have types that you want to make members of those type classes. For instance, we might want to use the statistics library for instances of the Joda Time &#x3C;code&#x3E;Duration&#x3C;/code&#x3E; type. To do that, we need Joda Time on our classpath, of course:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;libraryDependencies&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;joda-time&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;%&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;joda-time&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;%&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;2.1&#x22;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;libraryDependencies&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;org.joda&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;%&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;joda-convert&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;%&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;1.3&#x22;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now we just have to create an implicitly available implementation of &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; (please make sure you have Joda Time on your classpath when trying this out):&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;JodaImplicits&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Math.NumberLike&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;org.joda.time.Duration&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLikeDuration&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;NumberLike&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;plus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;divide&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;millis&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;getMillis&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;/&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Duration&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;x&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;minus&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;y&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;If we import the package or object containing this &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; implementation, we can now compute the mean value for a bunch of durations:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Statistics._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;JodaImplicits._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;org.joda.time.Duration._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;durations&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Vector&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;standardSeconds&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;20&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardSeconds&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;57&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardMinutes&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;standardMinutes&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;17&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardMinutes&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;30&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardMinutes&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;58&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardHours&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;standardHours&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;5&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardHours&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;8&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardHours&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;17&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;standardDays&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;1&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;standardDays&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;4&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;mean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;durations&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;getStandardHours&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;h2&#x3E;Use cases&#x3C;/h2&#x3E;&#x3C;p&#x3E;Our &#x3C;code&#x3E;NumberLike&#x3C;/code&#x3E; type class was a nice exercise, but Scala already ships with the &#x3C;code&#x3E;Numeric&#x3C;/code&#x3E; type class, which allows you to call methods like &#x3C;code&#x3E;sum&#x3C;/code&#x3E; or &#x3C;code&#x3E;product&#x3C;/code&#x3E; on collections for whose type &#x3C;code&#x3E;T&#x3C;/code&#x3E; a &#x3C;code&#x3E;Numeric[T]&#x3C;/code&#x3E; is available. Another type class in the standard library that you will use a lot is &#x3C;code&#x3E;Ordering&#x3C;/code&#x3E;, which allows you to provide an implicit ordering for your own types, available to the &#x3C;code&#x3E;sort&#x3C;/code&#x3E; method on Scala&#x2019;s collections.&#x3C;/p&#x3E;&#x3C;p&#x3E;There are more type classes in the standard library, but not all of them are ones you have to deal with on a regular basis as a Scala developer.&#x3C;/p&#x3E;&#x3C;p&#x3E;A very common use case in third-party libraries is that of object serialization and deserialization, most notably to and from JSON. By making your classes members of an appropriate formatter type class, you can customize the way your classes are serialized to JSON, XML or whatever format is currently the new black.&#x3C;/p&#x3E;&#x3C;p&#x3E;Mapping between Scala types and ones supported by your database driver is also commonly made customizable and extensible via type classes.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Summary&#x3C;/h2&#x3E;&#x3C;p&#x3E;Once you start to do some serious work with Scala, you will inevitably stumble upon type classes. I hope that after reading this article, you are prepared to take advantage of this powerful technique.&#x3C;/p&#x3E;&#x3C;p&#x3E;Scala type classes allow you to develop your Scala code in such a way that it&#x2019;s open for retroactive extension while retaining as much concrete type information as possible. In contrast to approaches from other languages, they give developers full control, as default type class implementations can be overridden without much hassle, and type classes implementations are not made available in the global namespace.&#x3C;/p&#x3E;&#x3C;p&#x3E;You will see that this technique is especially useful when writing libraries intended to be used by others, but type classes also have their use in application code to decrease coupling between modules.&#x3C;/p&#x3E;&#x3C;/div&#x3E;</description>
<pubDate>Mon, 02 Dec 2013 14:00:11 -0000</pubDate>
</item>
<item>
<title>The Neophyte&#x27;s Guide to Scala Part 13: Path-dependent types - Daniel Westheide</title>
<link>http://danielwestheide.com/blog/2013/02/13/the-neophytes-guide-to-scala-part-13-path-dependent-types.html</link>
<description>&#x3C;div class=&#x22;entry-content&#x22;&#x3E;&#x3C;p&#x3E;In last week&#x2019;s article, I &#x3C;a href=&#x22;http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html&#x22;&#x3E;introduced you to the idea of type classes&#x3C;/a&#x3E; &#x2013; a pattern that allows you to design your programs to be open for extension without giving up important information about concrete types. This week, I&#x2019;m going to stick with Scala&#x2019;s type system and talk about one of its features that distinguishes it from most other mainstream programming languages: Scala&#x2019;s form of dependent types, in particular path-dependent types and dependent method types.&#x3C;/p&#x3E;&#x3C;p&#x3E;One of the most widely used arguments against static typing is that &#x3C;em&#x3E;&#x201C;the compiler is just in the way&#x201D;&#x3C;/em&#x3E; and that in the end, it&#x2019;s all only data, so why care about building up a complex hierarchy of types?&#x3C;/p&#x3E;&#x3C;p&#x3E;In the end, having static types is all about preventing bugs by allowing the &#xFC;ber-smart compiler to humiliate you on a regular basis, making sure you&#x2019;re doing the right thing before it&#x2019;s too late.&#x3C;/p&#x3E;&#x3C;p&#x3E;Using path-dependent types is one powerful way to help the compiler prevent you from introducing bugs, as it places logic that is usually only available at runtime into types.&#x3C;/p&#x3E;&#x3C;p&#x3E;Sometimes, accidentally introducing path-dependent types can lead to frustation, though, especially if you have never heard of them. Hence, it&#x2019;s definitely a good idea to get familiar with them, whether you decide to put them to use or not.&#x3C;/p&#x3E;&#x3C;h2&#x3E;The problem&#x3C;/h2&#x3E;&#x3C;p&#x3E;I will start by presenting a problem that path-dependent types can help us solving: In the realm of fan fiction, the most atrocious things happen &#x2013; usually, the involved characters will end up making out with each other, regardless how inappropriate it is. There is even crossover fan fiction, in which two characters from different franchises are making out with each other.&#x3C;/p&#x3E;&#x3C;p&#x3E;However, elitist fan fiction writers look down on this. Surely there is a way to prevent such wrongdoing! Here is a first version of our domain model:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;   &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Franchise.Character&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createFanFiction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Characters are represented by instances of the &#x3C;code&#x3E;Character&#x3C;/code&#x3E; case class, and the &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E; class has a method to create a new piece of fan fiction about two characters. Let&#x2019;s create two franchises and some characters:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Star Trek&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starWars&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Star Wars&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quark&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Quark&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;jadzia&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Jadzia Dax&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;luke&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Luke Skywalker&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;yoda&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Yoda&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Unfortunately, at the moment we are unable to prevent bad things from happening:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;createFanFiction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;jadzia&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;luke&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Horrors of horrors! Someone has created a piece of fan fiction in which Jadzia Dax is making out with Luke Skywalker. Preposterous! Clearly, we should not allow this. Your first intuition might be to somehow check at runtime that two characters making out are from the same franchise. For example, we could change the model like so:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Franchise.Character&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createFanFiction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;require&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;franchise&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;==&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, the &#x3C;code&#x3E;Character&#x3C;/code&#x3E; instances have a reference to their &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E;, and trying to create a fan fiction with characters from different franchises will lead to an &#x3C;code&#x3E;IllegalArgumentException&#x3C;/code&#x3E; (feel free to try this out in a REPL).&#x3C;/p&#x3E;&#x3C;h2&#x3E;Safer fiction with path-dependent types&#x3C;/h2&#x3E;&#x3C;p&#x3E;This is pretty good, isn&#x2019;t it? It&#x2019;s the kind of fail-fast behaviour we have been indoctrinated with for years. However, with Scala, we can do better. There is a way to fail even faster &#x2013; not at runtime, but at compile time. To achieve that, we need to encode the connection between a &#x3C;code&#x3E;Character&#x3C;/code&#x3E; and its &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E; at the type level.&#x3C;/p&#x3E;&#x3C;p&#x3E;Luckily, the way Scala&#x2019;s nested types work allow us to do that. In Scala, a nested type is bound to a specific instance of the outer type, not to the outer type itself. This means that if you try to use an instance of the inner type outside of the instance of the enclosing type, you will face a compile error:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;A&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;B&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;b&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Option&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;B&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;None&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;a1&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;A&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;a2&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;A&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;b1&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;a1&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;B&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;b2&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;a2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;B&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;a1&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;b&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Some&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;b1&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;a2&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;b&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Some&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;b1&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;c1&#x22;&#x3E;// does not compile&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;You cannot simply assign an instance of the &#x3C;code&#x3E;B&#x3C;/code&#x3E; that is bound to &#x3C;code&#x3E;a2&#x3C;/code&#x3E; to the field on &#x3C;code&#x3E;a1&#x3C;/code&#x3E; &#x2013; the one is an &#x3C;code&#x3E;a2.B&#x3C;/code&#x3E;, the other expects an &#x3C;code&#x3E;a1.B&#x3C;/code&#x3E;. The dot syntax represents the path to the type, going along concrete instances of other types. Hence the name, path-dependent types.&#x3C;/p&#x3E;&#x3C;p&#x3E;We can put these to use in order to prevent characters from different franchises making out with each other:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createFanFictionWith&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, the type &#x3C;code&#x3E;Character&#x3C;/code&#x3E; is nested in the type &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E;, which means that it is dependent on a specific enclosing instance of the &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E; type.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s create our example franchises and characters again:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Star Trek&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starWars&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Star Wars&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quark&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Quark&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;jadzia&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Jadzia Dax&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;luke&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starWars&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Luke Skywalker&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;yoda&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;starWars&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Yoda&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;You can already see in how our &#x3C;code&#x3E;Character&#x3C;/code&#x3E; instances are created that their types are bound to a specific franchise. Let&#x2019;s see what happens if we try to put some of these characters together:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;createFanFictionWith&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;quark&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;jadzia&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;starWars&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;createFanFictionWith&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;luke&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;yoda&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;These two compile, as expected. They &#x3C;em&#x3E;are&#x3C;/em&#x3E; tasteless, but what can we do?&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, let&#x2019;s see what happens if we try to create some fan fiction about Jadzia Dax and Luke Skywalker:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;starTrek&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;createFanFictionWith&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;jadzia&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;luke&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Et voil&#xE0;: The thing that should not be does not even compile! The compiler complains about a type mismatch:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;found   : starWars.Character
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;required: starTrek.Character
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;               starTrek.createFanFictionWith(lovestruck = jadzia, objectOfDesire = luke)
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;                                                                                   ^&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;This technique also works if our method is not defined on the &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E; class, but in some other module. In this case, we can make use of dependent method types, where the type of one parameter depends on a previous parameter:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createFanFiction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;f&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Franchise&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;f.Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;f.Character&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;lovestruck&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;objectOfDesire&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;As you can see, the type of the &#x3C;code&#x3E;lovestruck&#x3C;/code&#x3E; and &#x3C;code&#x3E;objectOfDesire&#x3C;/code&#x3E; parameters depends on the &#x3C;code&#x3E;Franchise&#x3C;/code&#x3E; instance passed to the method. Note that this only works if the instance on which other types depend is in its own parameter list.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Abstract type members&#x3C;/h2&#x3E;&#x3C;p&#x3E;Often, dependent method types are used in conjunction with abstract type members. Suppose we want to develop a hipsterrific key-value store. It will only support setting and getting the value for a key, but in a typesafe manner. Here is our oversimplified implementation:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;AwesomeDB&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;abstract&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;name&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;type&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Value&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;AwesomeDB.Key&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;AwesomeDB&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;collection.mutable.Map&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;data&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;empty&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Key&#x3C;/span&#x3E;, &#x3C;span class=&#x22;kt&#x22;&#x3E;Any&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;key&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Option&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;key.Value&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;data&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;asInstanceOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Option&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;key.Value&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]]&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;set&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;key&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;value&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;key.Value&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Unit&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;data&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;update&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;value&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;We have defined a class &#x3C;code&#x3E;Key&#x3C;/code&#x3E; with an abstract type member &#x3C;code&#x3E;Value&#x3C;/code&#x3E;. The methods on &#x3C;code&#x3E;AwesomeDB&#x3C;/code&#x3E; refer to that type without ever knowing or caring about the specific manifestation of this abstract type.&#x3C;/p&#x3E;&#x3C;p&#x3E;We can now define some concrete keys that we want to use:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;IntValued&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Key&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;type&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Value&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Int&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;StringValued&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Key&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;type&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Value&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;String&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Keys&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;foo&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;foo&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;IntValued&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;bar&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Key&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;bar&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;StringValued&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now we can set and get key/value pairs in a typesafe manner:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;dataStore&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;AwesomeDB&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;dataStore&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;set&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Keys&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;foo&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;23&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;i&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Option&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;dataStore&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;get&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Keys&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;foo&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;dataStore&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;set&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Keys&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;foo&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;23&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;c1&#x22;&#x3E;// does not compile&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;h2&#x3E;Path-dependent types in practice&#x3C;/h2&#x3E;&#x3C;p&#x3E;While path-dependent types are not necessarily omnipresent in your typical Scala code, they do have a lot of practical value beyond modelling the domain of fan fiction.&#x3C;/p&#x3E;&#x3C;p&#x3E;One of the most widespread uses is probably seen in combination with the &#x3C;em&#x3E;cake pattern&#x3C;/em&#x3E;, which is a technique for composing your components and managing their dependencies, relying solely on features of the language. See the excellent articles &#x3C;a href=&#x22;http://debasishg.blogspot.ie/2013/02/modular-abstractions-in-scala-with.html&#x22;&#x3E;by Debasish Ghosh&#x3C;/a&#x3E; and &#x3C;a href=&#x22;http://precog.com/blog/Existential-Types-FTW/&#x22;&#x3E;Precog&#x2019;s Daniel Spiewak&#x3C;/a&#x3E; to learn more about both the cake pattern and how it can be improved by incorporating path-dependent types.&#x3C;/p&#x3E;&#x3C;p&#x3E;In general, whenever you want to make sure that objects created or managed by a specific instance of another type cannot accidentally or purposely be interchanged or mixed, path-dependent types are the way to go.&#x3C;/p&#x3E;&#x3C;p&#x3E;Path-dependent types and dependent method types play a crucial role for attempts to encode information into types that is typically only known at runtime, for instance heterogenous lists, type-level representations of natural numbers and collections that carry their size in their type. Miles Sabin is exploring the limits of Scala&#x2019;s type system in this respect in his excellent library &#x3C;a href=&#x22;https://github.com/milessabin/shapeless&#x22;&#x3E;Shapeless&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;/div&#x3E;</description>
<pubDate>Thu, 05 Dec 2013 14:00:12 -0000</pubDate>
</item>
<item>
<title>The Neophyte&#x27;s Guide to Scala Part 14: The Actor approach to concurrency - Daniel Westheide</title>
<link>http://danielwestheide.com/blog/2013/02/27/the-neophytes-guide-to-scala-part-14-the-actor-approach-to-concurrency.html</link>
<description>&#x3C;div class=&#x22;entry-content&#x22;&#x3E;&#x3C;p&#x3E;After several articles about how you can leverage the Scala type system to achieve a great amount of both flexibility and compile-time safety, we are now shifting back to a topic that we already tackled previously in this series: Scala&#x2019;s take on concurrency.&#x3C;/p&#x3E;&#x3C;p&#x3E;In &#x3C;a href=&#x22;http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html&#x22;&#x3E;these&#x3C;/a&#x3E; earlier &#x3C;a href=&#x22;http://danielwestheide.com/blog/2013/01/16/the-neophytes-guide-to-scala-part-9-promises-and-futures-in-practice.html&#x22;&#x3E;articles&#x3C;/a&#x3E;, you learned about an approach that allows you to work asynchronously by making use of composable Futures.&#x3C;/p&#x3E;&#x3C;p&#x3E;This approach is a very good fit for numerous problems. However, it&#x2019;s not the only one Scala has to offer. A second cornerstone of Scala concurrency is the &#x3C;em&#x3E;Actor&#x3C;/em&#x3E; model. It provides an approach to concurrency that is entirely based on passing messages between processes.&#x3C;/p&#x3E;&#x3C;p&#x3E;Actors are not a new idea &#x2013; the most prominent implementation of this model can be found in Erlang. The Scala core library has had its own actors library for a long time, but it faces the destiny of deprecation in the coming Scala version 2.11, when it will ultimately be replaced by the actors implementation provided by the &#x3C;a href=&#x22;http://akka.io&#x22;&#x3E;Akka&#x3C;/a&#x3E; toolkit, which has been a de-facto standard for actor-based development with Scala for quite a while.&#x3C;/p&#x3E;&#x3C;p&#x3E;In this article, you will be introduced to the rationale behind Akka&#x2019;s actor model and learn the basics of coding within this paradigm using the Akka toolkit. It is by no means an in-depth discussion of everything you need to know about Akka actors, and in that, it differs from most of the previous articles in this series. Rather, the intention is to familiarize you with the Akka mindset and serve as an initial spark to get you excited about it.&#x3C;/p&#x3E;&#x3C;h2&#x3E;The problems with shared mutable state&#x3C;/h2&#x3E;&#x3C;p&#x3E;The predominant approach to concurrency today is that of shared mutable state &#x2013; a large number of stateful objects whose state can be changed by multiple parts of your application, each running in their own thread. Typically, the code is interspersed with read and write locks, to make sure that the state can only be changed in a controlled way and prevent multiple threads from mutating it simultaneously. At the same time, we are trying hard not to lock too big a block of code, as this can drastically slow down the application.&#x3C;/p&#x3E;&#x3C;p&#x3E;More often than not, code like this has originally been written without having concurrency in mind at all &#x2013; only to be made fit for a multi-threaded world once the need arose. While writing software without the need for concurrency like this leads to very straightforward code, adapting it to the needs of a concurrent world leads to code that is really, really difficult to read and understand.&#x3C;/p&#x3E;&#x3C;p&#x3E;The core problem is that low-level synchronization constructs like locks and threads are &#x3C;em&#x3E;very hard to reason about&#x3C;/em&#x3E;. As a consequence, it&#x2019;s very hard to get it right: If you can&#x2019;t easily reason about what&#x2019;s going on, you can be sure that nasty bugs will ensue, from race conditions to deadlocks or just strange behaviour &#x2013; maybe you&#x2019;ll only notice after some months, long after your code has been deployed to your production servers.&#x3C;/p&#x3E;&#x3C;p&#x3E;Also, working with these low-level constructs makes it a real challenge to achieve an acceptable performance.&#x3C;/p&#x3E;&#x3C;h2&#x3E;The Actor model&#x3C;/h2&#x3E;&#x3C;p&#x3E;The Actor programming model is aimed at avoiding all the problems described above, allowing you to write highly performant concurrent code that is easy to reason about. Unlike the widely used approach of shared mutable state, it requires you to design and write your application from the ground up with concurrency in mind &#x2013; it&#x2019;s not really possible to add support for it later on.&#x3C;/p&#x3E;&#x3C;p&#x3E;The idea is that your application consists of lots of light-weight entities called actors. Each of these actors is responsible for only a very small task, and is thus easy to reason about. A more complex business logic arises out of the interaction between several actors, delegating tasks to others or passing messages to collaborators for other reasons.&#x3C;/p&#x3E;&#x3C;h3&#x3E;The Actor System&#x3C;/h3&#x3E;&#x3C;p&#x3E;Actors are pitiful creatures: They cannot live on their own. Rather, each and every actor in Akka resides in and is created by an &#x3C;em&#x3E;actor system&#x3C;/em&#x3E;. Aside from allowing you to create and find actors, an &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E; provides for a whole bunch of additional functionality, none of which shall concern us right now.&#x3C;/p&#x3E;&#x3C;p&#x3E;In order to try out the example code, please add the following resolver and dependency to your SBT-based Scala 2.10 project first:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;resolvers&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Typesafe Releases&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;at&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;http://repo.typesafe.com/typesafe/releases&#x22;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;libraryDependencies&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;com.typesafe.akka&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;%%&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;akka-actor&#x22;&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;%&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;2.2.3&#x22;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, let&#x2019;s create an &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E;. We&#x2019;ll need it as an environment for our actors:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor.ActorSystem&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;App&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorSystem&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Barista&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;shutdown&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;()&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;We created a new instance of &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E; and gave it the name &#x3C;code&#x3E;&#x22;Barista&#x22;&#x3C;/code&#x3E; &#x2013; we are returning to the domain of coffee, which should be familiar from the article on &#x3C;a href=&#x22;http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html&#x22;&#x3E;composable futures&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Finally, we are good citizens and shut down our actor system once we no longer need it.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Defining an actor&#x3C;/h3&#x3E;&#x3C;p&#x3E;Whether your application consists of a few dozen or a few million actors totally depends on your use case, but Akka is absolutely okay with a few million. You might be baffled by this insanely high number. It&#x2019;s important to understand that there is not a one-to-one relationship between an actor and a thread. You would soon run out of memory if that were the case. Rather, due to the non-blocking nature of actors, one thread can execute many actors &#x2013; switching between them depending on which of them has messages to be processed.&#x3C;/p&#x3E;&#x3C;p&#x3E;To understand what is actually happening, let&#x2019;s first create a very simple actor, a &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; that can receive orders but doesn&#x2019;t really do anything apart from printing messages to the console:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;sealed&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CoffeeRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CappuccinoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CoffeeRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CoffeeRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor.Actor&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CappuccinoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;I have to prepare a cappuccino!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Let&#x27;s prepare an espresso.&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;First, we define the types of messages that our actor understands. Typically, case classes are used for messages sent between actors if you need to pass along any parameters. If all the actor needs is an unparameterized message, this message is typically represented as a case object &#x2013; which is exactly what we are doing here.&#x3C;/p&#x3E;&#x3C;p&#x3E;In any case, it&#x2019;s crucial that your messages are immutable, or else bad things will happen.&#x3C;/p&#x3E;&#x3C;p&#x3E;Next, let&#x2019;s have a look at our class &#x3C;code&#x3E;Barista&#x3C;/code&#x3E;, which is the actual actor, extending the aptly named &#x3C;code&#x3E;Actor&#x3C;/code&#x3E; trait. Said trait defines a method &#x3C;code&#x3E;receive&#x3C;/code&#x3E; which returns a value of type &#x3C;code&#x3E;Receive&#x3C;/code&#x3E;. The latter is really only a type alias for &#x3C;code&#x3E;PartialFunction[Any, Unit]&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Processing messages&#x3C;/h3&#x3E;&#x3C;p&#x3E;So what&#x2019;s the meaning of this &#x3C;code&#x3E;receive&#x3C;/code&#x3E; method? The return type, &#x3C;code&#x3E;PartialFunction[Any, Unit]&#x3C;/code&#x3E; may seem strange to you in more than one respect.&#x3C;/p&#x3E;&#x3C;p&#x3E;In a nutshell, the partial function returned by the &#x3C;code&#x3E;receive&#x3C;/code&#x3E; method is responsible for processing your messages. Whenever another part of your software &#x2013; be it another actor or not &#x2013; sends your actor a message, Akka will &#x3C;em&#x3E;eventually&#x3C;/em&#x3E; let it process this message by calling the partial function returned by your actor&#x2019;s &#x3C;code&#x3E;receive&#x3C;/code&#x3E; method, passing it the message as an argument.&#x3C;/p&#x3E;&#x3C;h4&#x3E;Side-effecting&#x3C;/h4&#x3E;&#x3C;p&#x3E;When processing a message, an actor can do whatever you want it to, apart from returning a value.&#x3C;/p&#x3E;&#x3C;p&#x3E;&#x3C;em&#x3E;Wat!?&#x3C;/em&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;As the return type of &#x3C;code&#x3E;Unit&#x3C;/code&#x3E; suggests, your partial function is side-effecting. This might come as a bit of a shock to you after we emphasized the usage of pure functions all the time. For a concurrent programming model, this actually makes a lot of sense. Actors are where your state is located, and having some clearly defined places where side-effects will occur in a controllable manner is totally fine &#x2013; each message your actor receives is processed in isolation, one after another, so there is no need to reason about synchronization or locks.&#x3C;/p&#x3E;&#x3C;h4&#x3E;Untyped&#x3C;/h4&#x3E;&#x3C;p&#x3E;But&#x2026; this partial function is not only side-effecting, it&#x2019;s also as untyped as you can get in Scala, expecting an argument of type &#x3C;code&#x3E;Any&#x3C;/code&#x3E;. Why is that, when we have such a powerful type system at our fingertips?&#x3C;/p&#x3E;&#x3C;p&#x3E;This has a lot to do with some important design choices in Akka that allow you to do things like forwarding messages to other actors, installing load balancing or proxying actors without the sender having to know anything about them and so on.&#x3C;/p&#x3E;&#x3C;p&#x3E;In practice, this is usually not a problem. With the messages themselves being strongly typed, you typically use pattern matching for processing those types of messages you are interested in, just as we did in our tiny example above.&#x3C;/p&#x3E;&#x3C;p&#x3E;Sometimes though, the weakly typed actors can indeed lead to nasty bugs the compiler can&#x2019;t catch for you. If you have grown to love the benefits of a strong type system and think you don&#x2019;t want to go away from that at any costs for some parts of your application, you may want to look at Akka&#x2019;s new experimental &#x3C;a href=&#x22;http://doc.akka.io/docs/akka/snapshot/scala/typed-channels.html&#x22;&#x3E;Typed Channels&#x3C;/a&#x3E; feature.&#x3C;/p&#x3E;&#x3C;h4&#x3E;Asynchronous and non-blocking&#x3C;/h4&#x3E;&#x3C;p&#x3E;I wrote above that Akka would let your actor &#x3C;em&#x3E;eventually&#x3C;/em&#x3E; process a message sent to it. This is important to keep in mind: Sending a message and processing it is done in an asynchronous and non-blocking fashion. The sender will not be blocked until the message has been processed by the receiver. Instead, they can immediately continue with their own work. Maybe they expect to get a messsage from your actor in return after a while, or maybe they are not interested in hearing back from your actor at all.&#x3C;/p&#x3E;&#x3C;p&#x3E;What really happens when some component sends a message to an actor is that this message is delivered to the actor&#x2019;s &#x3C;em&#x3E;mailbox&#x3C;/em&#x3E;, which is basically a queue. Placing a message in an actor&#x2019;s mailbox is a non-blocking operation, i.e. the sender doesn&#x2019;t have to wait until the message is actually enqueued in the recipient&#x2019;s mailbox.&#x3C;/p&#x3E;&#x3C;p&#x3E;The &#x3C;em&#x3E;dispatcher&#x3C;/em&#x3E; will notice the arrival of a new message in an actor&#x2019;s mailbox, again asynchronously. If the actor is not already processing a previous message, it is now allocated to one of the threads available in the execution context. Once the actor is done processing any previous messages, the dispatcher sends it the next message from its mailbox for processing.&#x3C;/p&#x3E;&#x3C;p&#x3E;The actor blocks the thread to which it is allocated for as long as it takes to process the message. While this doesn&#x2019;t block the sender of the message, it means that lengthy operations degrade overall performance, as all the other actors have to be scheduled for processing messages on one of the remaining threads.&#x3C;/p&#x3E;&#x3C;p&#x3E;Hence, a core principle to follow for your &#x3C;code&#x3E;Receive&#x3C;/code&#x3E; partial functions is to spend as little time inside them as possible. Most importantly, avoid calling blocking code inside your message processing code, if possible at all.&#x3C;/p&#x3E;&#x3C;p&#x3E;Of course, this is something you can&#x2019;t prevent doing completely &#x2013; the majority of database drivers nowadays is still blocking, and you will want to be able to persist data or query for it from your actor-based application. There are solutions to this dilemma, but we won&#x2019;t cover them in this introductory article.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Creating an actor&#x3C;/h3&#x3E;&#x3C;p&#x3E;Defining an actor is all well and good, but how do we actually use our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor in our application? To do that, we have to create a new instance of our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor. You might be tempted to do it the usual way, by calling its constructor like so:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;c1&#x22;&#x3E;// will throw exception&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;This will not work! Akka will thank you with an &#x3C;code&#x3E;ActorInitializationException&#x3C;/code&#x3E;. The thing is, in order for the whole actor thingie to work properly, your actors need to be managed by the &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E; and its components. Hence, you have to ask the actor system for a new instance of your actor:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor.&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;ActorRef&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorRef&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Barista&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;The &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E; method defined on &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E; expects a &#x3C;code&#x3E;Props&#x3C;/code&#x3E; instance, which provides a means of configuring newly created actors, and, optionally, a name for your actor instance. We are using the simplest form of creating such a &#x3C;code&#x3E;Props&#x3C;/code&#x3E; instance, providing the &#x3C;code&#x3E;apply&#x3C;/code&#x3E; method of the companion object with a type parameter. Akka will then create a new instance of the actor of the given type by calling its default constructor.&#x3C;/p&#x3E;&#x3C;p&#x3E;Be aware that the type of the object returned by &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E; is not &#x3C;code&#x3E;Barista&#x3C;/code&#x3E;, but &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E;. Actors never communicate with another directly and hence there are supposed to be no direct references to actor instances. Instead, actors or other components of your application aquire references to the actors they need to send messages to.&#x3C;/p&#x3E;&#x3C;p&#x3E;Thus, an &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; acts as some kind of proxy to the actual actor. This is convenient because an &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; can be serialized, allowing it to be a proxy for a remote actor on some other machine. For the component aquiring an &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E;, the location of the actor &#x2013; local in the same JVM or remote on some other machine &#x2013; is completely transparent. We call this property &#x3C;em&#x3E;location transparency&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Please note that &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; is not parameterized by type. Any &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; can be exchanged for another, allowing you to send arbitrary messages to any &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E;. This is by design and, as already mentioned above, allows for easily modifying the topology of your actor system wihout having to make any changes to the senders.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Sending messages&#x3C;/h3&#x3E;&#x3C;p&#x3E;Now that we have created an instance of our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor and got an &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; linked to it, we can send it a message. This is done by calling the &#x3C;code&#x3E;!&#x3C;/code&#x3E; method on the &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E;:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CappuccinoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;I ordered a cappuccino and an espresso&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Calling the &#x3C;code&#x3E;!&#x3C;/code&#x3E; is a fire-and-forget operation: You &#x3C;em&#x3E;tell&#x3C;/em&#x3E; the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; that you want a cappuccino, but you don&#x2019;t wait for their response. It&#x2019;s the most common way in Akka for interacting with other actors. By calling this method, you tell Akka to enqueue your message in the recipient&#x2019;s mailbox. As described above, this doesn&#x2019;t block, and eventually the recipient actor will process your message.&#x3C;/p&#x3E;&#x3C;p&#x3E;Due to the asynchronous nature, the result of the above code is not deterministic. It might look like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;I have to prepare a cappuccino!
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;I ordered a cappuccino and an espresso
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;Let&#x27;s prepare an espresso.&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Even though we first sent the two messages to the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor&#x2019;s mailbox, between the processing of the first and second message, our own output is printed to the console.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Answering to messages&#x3C;/h3&#x3E;&#x3C;p&#x3E;Sometimes, being able to tell others what to do just doesn&#x2019;t cut it. You would like to be able to answer by in turn sending a message to the sender of a message you got &#x2013; all asynchronously of course.&#x3C;/p&#x3E;&#x3C;p&#x3E;To enable you to do that and lots of other things that are of no concern to us right now, actors have a method called &#x3C;code&#x3E;sender&#x3C;/code&#x3E;, which returns the &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; of the sender of the last message, i.e. the one you are currently processing.&#x3C;/p&#x3E;&#x3C;p&#x3E;But how does it know about that sender? The answer can be found in the signature of the &#x3C;code&#x3E;!&#x3C;/code&#x3E; method, which has a second, implicit parameter list:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;message&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Any&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)(&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorRef&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;noSender&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Unit&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;When called from an actor, its &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; is passed on as the implicit &#x3C;code&#x3E;sender&#x3C;/code&#x3E; argument.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s change our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; so that they immediately send a &#x3C;code&#x3E;Bill&#x3C;/code&#x3E; to the sender of a &#x3C;code&#x3E;CoffeeRequest&#x3C;/code&#x3E; before printing their usual output to the console:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;cents&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CappuccinoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;250&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;I have to prepare a cappuccino!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;200&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Let&#x27;s prepare an espresso.&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;shutdown&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;()&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;While we are at it, we are introducing a new message, &#x3C;code&#x3E;ClosingTime&#x3C;/code&#x3E;. The &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; reacts to it by shutting down the actor system, which they, like all actors, can access via their &#x3C;code&#x3E;ActorContext&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, let&#x2019;s introduce a second actor representing a customer:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;caffeineSource&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorRef&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;caffeineSource&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;cents&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;I have to pay $cents cents, or else!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;This actor is a real coffee junkie, so it needs to be able to order new coffee. We pass it an &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; in the constructor &#x2013; for the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E;, this is simply its &#x3C;code&#x3E;caffeineSource&#x3C;/code&#x3E; &#x2013; it doesn&#x2019;t know whether this &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; points to a &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; or something else. It knows that it can send &#x3C;code&#x3E;CoffeeRequest&#x3C;/code&#x3E; messages to it, and that is all that matters to them.&#x3C;/p&#x3E;&#x3C;p&#x3E;Finally, we need to create these two actors and send the customer a &#x3C;code&#x3E;CaffeineWithdrawalWarning&#x3C;/code&#x3E; to get things rolling:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Barista&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;customer&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;classOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Customer&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;customer&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Here, for the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actor, we are using a different factory method for creating a &#x3C;code&#x3E;Props&#x3C;/code&#x3E; instance: We pass in the type of the actor we want to have instantiated as well as the constructor arguments that actor takes. We need to do this because we want to pass the &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E; of our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor to the constructor of the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actor.&#x3C;/p&#x3E;&#x3C;p&#x3E;Sending the &#x3C;code&#x3E;CaffeineWithdrawalWarning&#x3C;/code&#x3E; to the customer makes it send an &#x3C;code&#x3E;EspressoRequest&#x3C;/code&#x3E; to the barista who will then send a &#x3C;code&#x3E;Bill&#x3C;/code&#x3E; back to the customer. The output of this may look like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;Let&#x27;s prepare an espresso.
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;I have to pay 200 cents, or else!&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;First, while processing the &#x3C;code&#x3E;EspressoRequest&#x3C;/code&#x3E; message, the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; sends a message to the sender of that message, the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actor. However, this operation doesn&#x2019;t block until the latter processes it. The &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor can continue processing the &#x3C;code&#x3E;EspressoRequest&#x3C;/code&#x3E; immediately, and does this by printing to the console. Shortly after, the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; starts to process the &#x3C;code&#x3E;Bill&#x3C;/code&#x3E; message and in turn prints to the console.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Asking questions&#x3C;/h3&#x3E;&#x3C;p&#x3E;Sometimes, sending an actor a message and expecting a message in return at some later time isn&#x2019;t an option &#x2013; the most common place where this is the case is in components that need to interface with actors, but are not actors themselves. Living outside of the actor world, they cannot receive messages.&#x3C;/p&#x3E;&#x3C;p&#x3E;For situations such as these, there is Akka&#x2019;s &#x3C;em&#x3E;ask&#x3C;/em&#x3E; support, which provides some sort of bridge between actor-based and future-based concurrency. From the client perspective, it works like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.pattern.ask&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.util.Timeout&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;scala.concurrent.duration._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;timeout&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Timeout&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mf&#x22;&#x3E;2.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;second&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;ec&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;dispatcher&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;f&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Future&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Any&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista2&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;?&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CappuccinoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;f&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;onSuccess&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;cents&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Will pay $cents cents for a cappuccino&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;First, you need to import support for the &#x3C;em&#x3E;ask&#x3C;/em&#x3E; syntax and create an implicit timeout for the &#x3C;code&#x3E;Future&#x3C;/code&#x3E; returned by the &#x3C;code&#x3E;?&#x3C;/code&#x3E; method. Also, the &#x3C;code&#x3E;Future&#x3C;/code&#x3E; needs an &#x3C;code&#x3E;ExecutionContext&#x3C;/code&#x3E;. Here, we simply use the default dispatcher of our &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E;, which is conveniently also an &#x3C;code&#x3E;ExecutionContext&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;As you can see, the returned future is untyped &#x2013; it&#x2019;s a &#x3C;code&#x3E;Future[Any]&#x3C;/code&#x3E;. This shouldn&#x2019;t come as a surprise, since it&#x2019;s really a received message from an actor, and those are untyped, too.&#x3C;/p&#x3E;&#x3C;p&#x3E;For the actor that is being asked, this is actually the same as sending some message to the sender of a processed message. This is why asking our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; works out of the box without having to change anything in our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor.&#x3C;/p&#x3E;&#x3C;p&#x3E;Once the actor being asked sends a message to the sender, the &#x3C;code&#x3E;Promise&#x3C;/code&#x3E; belonging to the returned &#x3C;code&#x3E;Future&#x3C;/code&#x3E; is completed.&#x3C;/p&#x3E;&#x3C;p&#x3E;Generally, telling is preferable to asking, because it&#x2019;s more resource-sparing. Akka is not for polite people! However, there are situations where you really need to ask, and then it&#x2019;s perfectly fine to do so.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Stateful actors&#x3C;/h3&#x3E;&#x3C;p&#x3E;Each actor may maintain an internal state, but that&#x2019;s not strictly necessary. Sometimes, a large part of the overall application state consists of the information carried by the immutable messages passed between actors.&#x3C;/p&#x3E;&#x3C;p&#x3E;An actor only ever processes one message at a time. While doing so, it may modify its internal state. This means that there is some kind of mutable state in an actor, but since each message is processed in isolation, there is no way the internal state of our actor can get messed up due to concurrency problems.&#x3C;/p&#x3E;&#x3C;p&#x3E;To illustrate, let&#x2019;s turn our stateless &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; into an actor carrying state, by simply counting the number of orders:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;cappuccinoCount&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;0&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;espressoCount&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;0&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CappuccinoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;250&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;cappuccinoCount&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;I have to prepare cappuccino #$cappuccinoCount&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Bill&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;200&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;espressoCount&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;println&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Let&#x27;s prepare espresso #$espressoCount.&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;shutdown&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;()&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;We introduced two &#x3C;code&#x3E;vars&#x3C;/code&#x3E;, &#x3C;code&#x3E;cappuccinoCount&#x3C;/code&#x3E; and &#x3C;code&#x3E;espressoCount&#x3C;/code&#x3E; that are incremented with each respective order. This is actually the first time in this series that we have used a &#x3C;code&#x3E;var&#x3C;/code&#x3E;. While to be avoided in functional programming, they are really the only way to allow your actors to carry state. Since each message is processed in isolation, our above code is similar to using &#x3C;code&#x3E;AtomicInteger&#x3C;/code&#x3E; values in a non-actor environment.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Conclusion&#x3C;/h2&#x3E;&#x3C;p&#x3E;And here ends our introduction to the actor programming model for concurrency and how to work within this paradigm using Akka. While we have really only scratched the surface and have ignored some important concepts of Akka, I hope to have given enough of an insight into this approach to concurrency to give you a basic understanding and get you interested in learning more.&#x3C;/p&#x3E;&#x3C;p&#x3E;In the coming articles, I will elaborate our little example, adding some meaningful behaviour to it while introducing more of the ideas behind Akka actors, among them the question of how errors are handled in an actor system.&#x3C;/p&#x3E;&#x3C;p&#x3E;P.S. Please note that starting with this article I have switched to a biweekly schedule for the remaining parts of this series.&#x3C;/p&#x3E;&#x3C;/div&#x3E;</description>
<pubDate>Mon, 09 Dec 2013 14:00:21 -0000</pubDate>
</item>
<item>
<title>The Neophyte&#x27;s Guide to Scala Part 15: Dealing with Failure in Actor Systems - Daniel Westheide</title>
<link>http://danielwestheide.com/blog/2013/03/20/the-neophytes-guide-to-scala-part-15-dealing-with-failure-in-actor-systems.html</link>
<description>&#x3C;div class=&#x22;entry-content&#x22;&#x3E;&#x3C;p&#x3E;In the previous part of this series, I introduced you to the second cornerstone of Scala concurrency: The &#x3C;em&#x3E;actor&#x3C;/em&#x3E; model, which complements the model based on composable &#x3C;em&#x3E;futures&#x3C;/em&#x3E; backed by &#x3C;em&#x3E;promises&#x3C;/em&#x3E;. You learnt how to define and create actors, how to send messages to them and how an actor processes these messages, possibly modifying its internal state as a result or asynchronously sending a response message to the sender.&#x3C;/p&#x3E;&#x3C;p&#x3E;While that was hopefully enough to get you interested in the actor model for concurrency, I left out some crucial concepts you will want to know about before starting to develop actor-based applications that consist of more than a simple echo actor.&#x3C;/p&#x3E;&#x3C;p&#x3E;The actor model is meant to help you achieve a high level of fault tolerance. In this article, we are going to have a look at how to deal with failure in an actor-based application, which is fundamentally different from error handling in a traditional layered server architecture.&#x3C;/p&#x3E;&#x3C;p&#x3E;The way you deal with failure is closely linked to some core Akka concepts and to some of the elements an actor system in Akka consists of. Hence, this article will also serve as a guide to those ideas and components.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Actor hierarchies&#x3C;/h2&#x3E;&#x3C;p&#x3E;Before going into what happens when an error occurs in one of your actors, it&#x2019;s essential to introduce one crucial idea underlying the actor approach to concurrency &#x2013; an idea that is the very foundation for allowing you to build fault-tolerant concurrent applications: Actors are organized in a hierarchy.&#x3C;/p&#x3E;&#x3C;p&#x3E;So what does this mean? First of all, it means that every single of your actors has got a parent actor, and that each actor can create child actors. Basically, you can think of an actor system as a pyramid of actors. Parent actors watch over their children, just as in real life, taking care that they get back on their feet if they stumble. You will see shortly how exactly this is done.&#x3C;/p&#x3E;&#x3C;h3&#x3E;The guardian actor&#x3C;/h3&#x3E;&#x3C;p&#x3E;In the previous article, we only had two different actors, a &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor and a &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actor. I will not repeat their rather trivial implementations, but focus on how we created instances of these actor types:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor.ActorSystem&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorSystem&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Coffeehouse&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Barista&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;customer&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;classOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Customer&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;As you can see, we create these two actors by calling the &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E; method defined on the &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E; type.&#x3C;/p&#x3E;&#x3C;p&#x3E;So what is the parent of these two actors? Is it the actor system? Not quite, but close. The actor system is not an actor itself, but it has got a so-called &#x3C;em&#x3E;guardian actor&#x3C;/em&#x3E; that serves as the parent of all root-level user actors, i.e. actors we create by calling &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E; on our actor system.&#x3C;/p&#x3E;&#x3C;p&#x3E;There shouldn&#x2019;t be a whole lot of actors in your system that are children of the guardian actor. It really makes more sense to have only a few top-level actors, each of them delegating most of the work to their children.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Actor paths&#x3C;/h3&#x3E;&#x3C;p&#x3E;The hierarchical structure of an actor system becomes apparent when looking at the &#x3C;em&#x3E;actor paths&#x3C;/em&#x3E; of the actors you create. These are basically URLs by which actors can be addressed. You can get an actor&#x2019;s path by calling &#x3C;code&#x3E;path&#x3C;/code&#x3E; on its &#x3C;code&#x3E;ActorRef&#x3C;/code&#x3E;:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;path&#x3C;/span&#x3E; &#x3C;span class=&#x22;c1&#x22;&#x3E;// =&#x3E; akka.actor.ActorPath = akka://Coffeehouse/user/Barista&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;path&#x3C;/span&#x3E; &#x3C;span class=&#x22;c1&#x22;&#x3E;// =&#x3E; akka.actor.ActorPath = akka://Coffeehouse/user/Customer&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;The &#x3C;code&#x3E;akka&#x3C;/code&#x3E; protocol is followed by the name of our actor system, the name of the user guardian actor and, finally, the name we gave our actor when calling &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E; on the system. In the case of remote actors, running on different machines, you would additionally see a host and a port.&#x3C;/p&#x3E;&#x3C;p&#x3E;Actor paths can be used to look up another actor. For example, instead of requiring the barista reference in its constructor, the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actor could call the &#x3C;code&#x3E;actorSelection&#x3C;/code&#x3E; method on its &#x3C;code&#x3E;ActorContext&#x3C;/code&#x3E;, passing in a relative path to retrieve a reference to the barista:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorSelection&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;../Barista&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;However, while being able to look up an actor by its path can sometimes come in handy, it&#x2019;s often a much better idea to pass in dependencies in the constructor, just as we did before. Too much intimate knowledge about where your dependencies are located in the actor system makes your system more susceptible to bugs, and it will be difficult to refactor later on.&#x3C;/p&#x3E;&#x3C;h3&#x3E;An example hierarchy&#x3C;/h3&#x3E;&#x3C;p&#x3E;To illustrate how parents watch over their children and what this has got to do with keeping your system fault-tolerant, I&#x2019;m going to stick to the domain of the coffeehouse. Let&#x2019;s give the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor a child actor to which it can delegate some of the work involved in running a coffeehouse.&#x3C;/p&#x3E;&#x3C;p&#x3E;If we really were to model the work of a barista, we were likely giving them a bunch of child actors for all the various subtasks. But to keep this article focused, we have to be a little simplistic with our example.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s assume that the barista has got a register. It processes transactions, printing appropriate receipts and incrementing the day&#x2019;s sales so far. Here is a first version of it:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;20&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Register&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;sealed&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Article&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Espresso&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Article&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Cappuccino&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Article&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Register&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Register._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Barista._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;0&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Article&#x3C;/span&#x3E;, &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Espresso&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;150&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Cappuccino&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;250&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Receipt&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;It contains an immutable map of the prices for each article, and an integer variable representing the revenue. Whenever it receives a &#x3C;code&#x3E;Transaction&#x3C;/code&#x3E; message, it increments the revenue accordingly and returns a printed receipt to the sender.&#x3C;/p&#x3E;&#x3C;p&#x3E;The &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor, as already mentioned, is supposed to be a child actor of the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor, which means that we will not create it from our actor system, but from within our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor. The initial version of our actor-come-parent looks like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;20&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;21&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;22&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;23&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;24&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;25&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;26&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;27&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;28&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;29&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;30&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;31&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoCup&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;state&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;EspressoCup.State&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoCup&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;sealed&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;State&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Clean&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;State&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Filled&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;State&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Dirty&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;State&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Barista._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Register._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;EspressoCup._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;context.dispatcher&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.util.Timeout&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.pattern.ask&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.pattern.pipe&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;concurrent.duration._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;timeout&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Timeout&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mf&#x22;&#x3E;4.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;seconds&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;register&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Register&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Register&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;register&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;?&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Espresso&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;((&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoCup&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Filled&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;pipeTo&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;stop&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;self&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;First off, we define the message types that our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor is able to deal with. An &#x3C;code&#x3E;EspressoCup&#x3C;/code&#x3E; can have one out of a fixed set of states, which we ensure by using a sealed trait.&#x3C;/p&#x3E;&#x3C;p&#x3E;The more interesting part is to be found in the implementation of the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; class. The &#x3C;code&#x3E;dispatcher&#x3C;/code&#x3E;, &#x3C;code&#x3E;ask&#x3C;/code&#x3E;, and &#x3C;code&#x3E;pipe&#x3C;/code&#x3E; imports as well as the implicit timeout are required because we make use of Akka&#x2019;s ask syntax and futures in our &#x3C;code&#x3E;Receive&#x3C;/code&#x3E; partial function: When we receive an &#x3C;code&#x3E;EspressoRequest&#x3C;/code&#x3E;, we ask the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor for a &#x3C;code&#x3E;Receipt&#x3C;/code&#x3E; for our &#x3C;code&#x3E;Transaction&#x3C;/code&#x3E;. This is then combined with a filled espresso cup and piped to the sender, which will thus receive a tuple of type &#x3C;code&#x3E;(EspressoCup, Receipt)&#x3C;/code&#x3E;. This kind of delegating subtasks to child actors and then aggregating or amending their work is typical for actor-based applications.&#x3C;/p&#x3E;&#x3C;p&#x3E;Also, note how we create our child actor by calling &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E; on our &#x3C;code&#x3E;ActorContext&#x3C;/code&#x3E; instead of the &#x3C;code&#x3E;ActorSystem&#x3C;/code&#x3E;. By doing so, the actor we create becomes a child actor of the one who called this method, instead of a top-level actor whose parent is the guardian actor.&#x3C;/p&#x3E;&#x3C;p&#x3E;Finally, here is our &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actor, which, like the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor, will sit at the top level, just below the guardian actor:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Customer&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;coffeeSource&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorRef&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorLogging&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Customer._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Barista._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;EspressoCup._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;coffeeSource&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoCup&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Filled&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;yay, caffeine for ${self}!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;It is not terribly interesting for our tutorial, which focuses more on the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor hierarchy. What&#x2019;s new is the use of the &#x3C;code&#x3E;ActorLogging&#x3C;/code&#x3E; trait, which allows us to write to the log instead of printing to the console.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, if we create our actor system and populate it with a &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; and two &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actors, we can happily feed our two under-caffeinated addicts with a shot of black gold:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Customer._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorSystem&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Coffeehouse&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Barista&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;customerJohnny&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;classOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Johnny&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;customerAlina&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;classOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Alina&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;customerJohnny&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;customerAlina&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;If you try this out, you should see two log messages from happy customers.&#x3C;/p&#x3E;&#x3C;h2&#x3E;To crash or not to crash?&#x3C;/h2&#x3E;&#x3C;p&#x3E;Of course, what we are really interested in, at least in this article, is not happy customers, but the question of what happens if things go wrong.&#x3C;/p&#x3E;&#x3C;p&#x3E;Our register is a fragile device &#x2013; its printing functionality is not as reliable as it should be. Every so often, a paper jam causes it to fail. Let&#x2019;s add a &#x3C;code&#x3E;PaperJamException&#x3C;/code&#x3E; type to the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; companion object:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PaperJamException&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;msg&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Exception&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;msg&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Then, let&#x2019;s change the &#x3C;code&#x3E;createReceipt&#x3C;/code&#x3E; method in our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor accordingly:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Receipt&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;util.Random&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;if&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Random&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;nextBoolean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;())&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;throw&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PaperJamException&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;OMG, not again!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, when processing a &#x3C;code&#x3E;Transaction&#x3C;/code&#x3E; message, our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor will throw a &#x3C;code&#x3E;PaperJamException&#x3C;/code&#x3E; in about half of the cases.&#x3C;/p&#x3E;&#x3C;p&#x3E;What effect does this have on our actor system, or on our whole application? Luckily, Akka is very robust and not affected by exceptions in our code at all. What happens, though, is that the parent of the misbehaving child is notified &#x2013; remember that parents are watching over their children, and this is the situation where they have to decide what to do.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Supervisor strategies&#x3C;/h3&#x3E;&#x3C;p&#x3E;The whole act of being notified about exceptions in child actors, however, is not handled by the parent actor&#x2019;s &#x3C;code&#x3E;Receive&#x3C;/code&#x3E; partial function, as that would confound the parent actor&#x2019;s own behaviour with the logic for dealing with failure in its children. Instead, the two responsibilities are clearly separated.&#x3C;/p&#x3E;&#x3C;p&#x3E;Each actor defines its own &#x3C;em&#x3E;supervisor strategy&#x3C;/em&#x3E;, which tells Akka how to deal with certain types of errors occurring in your children.&#x3C;/p&#x3E;&#x3C;p&#x3E;There are basically two different types of supervisor strategy, the &#x3C;code&#x3E;OneForOneStrategy&#x3C;/code&#x3E; and the &#x3C;code&#x3E;AllForOneStrategy&#x3C;/code&#x3E;. Choosing the former means that the way you want to deal with an error in one of your children will only affect the child actor from which the error originated, whereas the latter will affect all of your child actors. Which of those strategies is best depends a lot on your individual application.&#x3C;/p&#x3E;&#x3C;p&#x3E;Regardless of which type of &#x3C;code&#x3E;SupervisorStrategy&#x3C;/code&#x3E; you choose for your actor, you will have to specify a &#x3C;code&#x3E;Decider&#x3C;/code&#x3E;, which is a &#x3C;code&#x3E;PartialFunction[Throwable, Directive]&#x3C;/code&#x3E; &#x2013; this allows you to match against certain subtypes of &#x3C;code&#x3E;Throwable&#x3C;/code&#x3E; and decide for each of them what&#x2019;s supposed to happen to your problematic child actor (or all your child actors, if you chose the all-for-one strategy).&#x3C;/p&#x3E;&#x3C;h3&#x3E;Directives&#x3C;/h3&#x3E;&#x3C;p&#x3E;Here is a list of the available directives:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;sealed&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;trait&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Directive&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Resume&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Directive&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Restart&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Directive&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Stop&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Directive&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Escalate&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Directive&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;ul&#x3E;&#x3C;li&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Resume:&#x3C;/strong&#x3E; If you choose to &#x3C;code&#x3E;Resume&#x3C;/code&#x3E;, this probably means that you think of your child actor as a little bit of a drama queen. You decide that the exception was not so exceptional after all &#x2013; the child actor or actors will simply resume processing messages as if nothing extraordinary had happened.&#x3C;/p&#x3E;&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Restart:&#x3C;/strong&#x3E; The &#x3C;code&#x3E;Restart&#x3C;/code&#x3E; directive causes Akka to create a new instance of your child actor or actors. The reasoning behind this is that you assume that the internal state of the child/children is corrupted in some way so that it can no longer process any further messages. By restarting the actor, you hope to put it into a clean state again.&#x3C;/p&#x3E;&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Stop:&#x3C;/strong&#x3E; You effectively kill the actor. It will not be restarted.&#x3C;/p&#x3E;&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Escalate:&#x3C;/strong&#x3E; If you choose to &#x3C;code&#x3E;Escalate&#x3C;/code&#x3E;, you probably don&#x2019;t know how to deal with the failure at hand. You delegate the decision about what to do to your own parent actor, hoping they are wiser than you. If an actor escalates, they may very well be restarted themselves by their parent, as the parent will only decide about its own child actors.&#x3C;/p&#x3E;&#x3C;/li&#x3E;&#x3C;/ul&#x3E;&#x3C;h3&#x3E;The default strategy&#x3C;/h3&#x3E;&#x3C;p&#x3E;You don&#x2019;t have to specify your own supervisor strategy in each and every actor. In fact, we haven&#x2019;t done that so far. This means that the default supervisor strategy will take effect. It looks like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;final&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;defaultStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;SupervisorStrategy&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;defaultDecider&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Decider&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorInitializationException&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;&#x21D2;&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Stop&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorKilledException&#x3C;/span&#x3E;         &#x3C;span class=&#x22;k&#x22;&#x3E;&#x21D2;&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Stop&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Exception&#x3C;/span&#x3E;                    &#x3C;span class=&#x22;k&#x22;&#x3E;&#x21D2;&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Restart&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;nc&#x22;&#x3E;OneForOneStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;()(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;defaultDecider&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;This means that for exceptions other than &#x3C;code&#x3E;ActorInitializationException&#x3C;/code&#x3E; or &#x3C;code&#x3E;ActorKilledException&#x3C;/code&#x3E;, the respective child actor in which the exception was thrown will be restarted.&#x3C;/p&#x3E;&#x3C;p&#x3E;Hence, when a &#x3C;code&#x3E;PaperJamException&#x3C;/code&#x3E; occurs in our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor, the supervisor strategy of the parent actor (the barista) will cause the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; to be restarted, because we haven&#x2019;t overridden the default strategy.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you try this out, you will likely see an exception stacktrace in the log, but nothing about the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor being restarted.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s verify that this is really happening. To do so, however, you will need to learn about the &#x3C;em&#x3E;actor lifecycle&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;h3&#x3E;The actor lifecycle&#x3C;/h3&#x3E;&#x3C;p&#x3E;To understand what the directives of a supervisor strategy actually do, it&#x2019;s crucial to know a little bit about an actor&#x2019;s lifecycle. Basically, it boils down to this: when created via &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E;, an actor is &#x3C;em&#x3E;started&#x3C;/em&#x3E;. It can then be &#x3C;em&#x3E;restarted&#x3C;/em&#x3E; an arbitrary number of times, in case there is a problem with it. Finally, an actor can be &#x3C;em&#x3E;stopped&#x3C;/em&#x3E;, ultimately leading to its death.&#x3C;/p&#x3E;&#x3C;p&#x3E;There are numerous lifecycle hook methods that an actor implementation can override. It&#x2019;s also important to know their default implementations. Let&#x2019;s go through them briefly:&#x3C;/p&#x3E;&#x3C;ul&#x3E;&#x3C;li&#x3E;&#x3C;strong&#x3E;preStart:&#x3C;/strong&#x3E; Called when an actor is started, allowing you to do some initialization logic. The default implementation is empty.&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;strong&#x3E;postStop:&#x3C;/strong&#x3E; Empty by default, allowing you to clean up resources. Called after &#x3C;code&#x3E;stop&#x3C;/code&#x3E; has been called for the actor.&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;strong&#x3E;preRestart:&#x3C;/strong&#x3E; Called right before a crashed actor is restarted. By default, it stops all children of that actor and then calls &#x3C;code&#x3E;postStop&#x3C;/code&#x3E; to allow cleaning up of resources.&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;strong&#x3E;postRestart:&#x3C;/strong&#x3E; Called immediately after an actor has been restarted. Simply calls &#x3C;code&#x3E;preStart&#x3C;/code&#x3E; by default.&#x3C;/li&#x3E;&#x3C;/ul&#x3E;&#x3C;p&#x3E;This means that by default, restarting an actor entails a restart of its children. This may be exactly what you want, depending on your specific actor and use case. If it&#x2019;s not what you want, these hook methods allow you to change that behaviour.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s see if our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; gets indeed restarted upon failure by simply adding some log output to its &#x3C;code&#x3E;postRestart&#x3C;/code&#x3E; method. Make the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; type extend the &#x3C;code&#x3E;ActorLogging&#x3C;/code&#x3E; trait and add the following method to it:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;override&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Throwable&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;super&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Restarted because of ${reason.getMessage}&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, if you send the two &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actors a bunch of &#x3C;code&#x3E;CaffeineWithdrawalWarning&#x3C;/code&#x3E; messages, you should see the one or the other of those log outputs, confirming that our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor has been restarted.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Death of an actor&#x3C;/h3&#x3E;&#x3C;p&#x3E;Often, it doesn&#x2019;t make sense to restart an actor again and again &#x2013; think of an actor that talks to some other service over the network, and that service has been unreachable for a while. In such cases, it is a very good idea to tell Akka how often to restart an actor within a certain period of time. If that limit is exceeded, the actor is instead stopped and hence dies. Such a limit can be configured in the constructor of the supervisor strategy:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;scala.concurrent.duration._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor.OneForOneStrategy&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.actor.SupervisorStrategy.Restart&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;OneForOneStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mi&#x22;&#x3E;10&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;mf&#x22;&#x3E;2.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;minutes&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Restart&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;h3&#x3E;The self-healing system?&#x3C;/h3&#x3E;&#x3C;p&#x3E;So, is our system running smoothly, healing itself whenever this damn paper jam occurs? Let&#x2019;s change our log output:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;override&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Throwable&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;super&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Restarted, and revenue is $revenue cents&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;And while we are at it, let&#x2019;s also add some more logging to our &#x3C;code&#x3E;Receive&#x3C;/code&#x3E; partial function, making it look like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Revenue incremented to $revenue cents&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Ouch! Something is clearly not as it should be. In the log, you will see the revenue increasing, but as soon as there is a paper jam and the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor restarts, it is reset to &#x3C;code&#x3E;0&#x3C;/code&#x3E;. This is because restarting indeed means that the old instance is discarded and a new one created as per the &#x3C;code&#x3E;Props&#x3C;/code&#x3E; we initially passed to &#x3C;code&#x3E;actorOf&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Of course, we could change our supervisor strategy, so that it resumes in case of a &#x3C;code&#x3E;PaperJamException&#x3C;/code&#x3E;. We would have to add this to the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;decider&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;PartialFunction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Throwable&#x3C;/span&#x3E;, &#x3C;span class=&#x22;kt&#x22;&#x3E;Directive&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;]&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;PaperJamException&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Resume&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;override&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;supervisorStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;SupervisorStrategy&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;nc&#x22;&#x3E;OneForOneStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;()(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;decider&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;orElse&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;SupervisorStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;defaultStrategy&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;decider&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, the actor is not restarted upon a &#x3C;code&#x3E;PaperJamException&#x3C;/code&#x3E;, so its state is not reset.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Error kernel&#x3C;/h3&#x3E;&#x3C;p&#x3E;So we just found a nice solution to preserve the state of our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor, right?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well, sometimes, simply resuming might be the best thing to do. But let&#x2019;s assume that we really &#x3C;em&#x3E;have&#x3C;/em&#x3E; to restart it, because otherwise the paper jam will not disappear. We can simulate this by maintaining a boolean flag that says if we are in a paper jam situation or not. Let&#x2019;s change our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; like so:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;20&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;21&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;22&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;23&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;24&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Register&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorLogging&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Register._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;Barista._&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;0&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Article&#x3C;/span&#x3E;, &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Espresso&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;150&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Cappuccino&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;250&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;paperJam&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;kc&#x22;&#x3E;false&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;override&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Throwable&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;super&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Restarted, and revenue is $revenue cents&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Revenue incremented to $revenue cents&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Receipt&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;util.Random&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;if&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Random&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;nextBoolean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;())&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;paperJam&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;kc&#x22;&#x3E;true&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;if&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;paperJam&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;throw&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PaperJamException&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;OMG, not again!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Also remove the supervisor strategy we added to the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, the paper jam remains forever, until we have restarted the actor. Alas, we cannot do that without also losing important state regarding our revenue.&#x3C;/p&#x3E;&#x3C;p&#x3E;This is where the &#x3C;em&#x3E;error kernel&#x3C;/em&#x3E; pattern comes in. Basically, it is just a simple guideline you should always try to follow, stating that if an actor carries important internal state, then it should delegate dangerous tasks to child actors, so as to prevent the state-carrying actor from crashing. Sometimes, it may make sense to spawn a new child actor for each such task, but that&#x2019;s not a necessity.&#x3C;/p&#x3E;&#x3C;p&#x3E;The essence of the pattern is to keep important state as far at the top of the actor hierarchy as possible, while pushing error-prone tasks as far to the bottom of the hierarchy as possible.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x2019;s apply this pattern to our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor. We will keep the revenue state in the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor, but move the error-prone behaviour of printing the receipt to a new child actor, which we appropriately enough call &#x3C;code&#x3E;ReceiptPrinter&#x3C;/code&#x3E;. Here is the latter:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;object&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ReceiptPrinter&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PrintJob&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PaperJamException&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;msg&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;String&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Exception&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;msg&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ReceiptPrinter&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorLogging&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;paperJam&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;kc&#x22;&#x3E;false&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;override&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Throwable&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;super&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Restarted, paper jam == $paperJam&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PrintJob&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;createReceipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Receipt&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;if&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Random&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;nextBoolean&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;())&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;paperJam&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;kc&#x22;&#x3E;true&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;if&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;paperJam&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;throw&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PaperJamException&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;OMG, not again!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Again, we simulate the paper jam with a boolean flag and throw an exception each time someone asks us to print a receipt while in a paper jam. Other than the new message type, &#x3C;code&#x3E;PrintJob&#x3C;/code&#x3E;, this is really just extracted from the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; type.&#x3C;/p&#x3E;&#x3C;p&#x3E;This is a good thing, not only because it moves away this dangerous operation from the stateful &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor, but it also makes our code simpler and consequently easier to reason about: The &#x3C;code&#x3E;ReceiptPrinter&#x3C;/code&#x3E; actor is responsible for exactly one thing, and the &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor has become simpler, too, now being only responsible for managing the revenue, delegating the remaining functionality to a child actor:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;19&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;20&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;21&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;22&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;23&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Register&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorLogging&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.pattern.ask&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;akka.pattern.pipe&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;context.dispatcher&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;implicit&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;timeout&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Timeout&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mf&#x22;&#x3E;4.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;seconds&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;var&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;0&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;Article&#x3C;/span&#x3E;, &#x3C;span class=&#x22;kt&#x22;&#x3E;Int&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;](&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Espresso&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;150&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Cappuccino&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;-&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;mi&#x22;&#x3E;250&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;printer&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;actorOf&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Props&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;[&#x3C;/span&#x3E;&#x3C;span class=&#x22;kt&#x22;&#x3E;ReceiptPrinter&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;],&#x3C;/span&#x3E; &#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Printer&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;override&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Throwable&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;super&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;postRestart&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;reason&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Restarted, and revenue is $revenue cents&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;prices&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;article&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;requester&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;printer&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;?&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;PrintJob&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;price&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;((&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;requester&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;pipeTo&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;self&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;requester&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorRef&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;,&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;revenue&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;+=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;revenue is $revenue cents&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;requester&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;We don&#x2019;t spawn a new &#x3C;code&#x3E;ReceiptPrinter&#x3C;/code&#x3E; for each &#x3C;code&#x3E;Transaction&#x3C;/code&#x3E; message we get. Instead, we use the default supervisor strategy to have the printer actor restart upon failure.&#x3C;/p&#x3E;&#x3C;p&#x3E;One part that merits explanation is the weird way we increment our revenue: First we ask the printer for a receipt. We map the future to a tuple containing the answer as well as the requester, which is the sender of the &#x3C;code&#x3E;Transaction&#x3C;/code&#x3E; message and pipe this to ourselves. When processing that message, we finally increment the revenue and send the receipt to the requester.&#x3C;/p&#x3E;&#x3C;p&#x3E;The reason for that indirection is that we want to make sure that we only increment our revenue if the receipt was successfully printed. Since it is vital to never ever modify the internal state of an actor inside of a future, we have to use this level of indirection. It helps us make sure that we only change the revenue within the confines of our actor, and not on some other thread.&#x3C;/p&#x3E;&#x3C;p&#x3E;Assigning the &#x3C;code&#x3E;sender&#x3C;/code&#x3E; to a &#x3C;code&#x3E;val&#x3C;/code&#x3E; is necessary for similar reasons: When mapping a future, we are no longer in the context of our actor either &#x2013; since &#x3C;code&#x3E;sender&#x3C;/code&#x3E; is a method, it would now likely return the reference to some other actor that has sent us a message, not the one we intended.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, our &#x3C;code&#x3E;Register&#x3C;/code&#x3E; actor is safe from constantly being restarted, yay!&#x3C;/p&#x3E;&#x3C;p&#x3E;Of course, the very idea of having the printing of the receipt and the management of the revenue in one place is questionable. Having them together came in handy for demonstrating the error kernel pattern. Yet, it would certainly be a lot better to seperate the receipt printing from the revenue management altogether, as these are two concerns that don&#x2019;t really belong together.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Timeouts&#x3C;/h3&#x3E;&#x3C;p&#x3E;Another thing that we may want to improve upon is the handling of timeouts. Currently, when an exception occurs in the &#x3C;code&#x3E;ReceiptPrinter&#x3C;/code&#x3E;, this leads to an &#x3C;code&#x3E;AskTimeoutException&#x3C;/code&#x3E;, which, since we are using the ask syntax, comes back to the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor in an unsuccessfully completed &#x3C;code&#x3E;Future&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Since the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor simply maps over that future (which is success-biased) and then pipes the transformed result to the customer, the customer will also receive a &#x3C;code&#x3E;Failure&#x3C;/code&#x3E; containing an &#x3C;code&#x3E;AskTimeoutException&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;The &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; didn&#x2019;t ask for anything, though, so it is certainly not expecting such a message, and in fact, it currently doesn&#x2019;t handle these messages. Let&#x2019;s be friendly and send customers a &#x3C;code&#x3E;ComebackLater&#x3C;/code&#x3E; message &#x2013; this is a message they already understand, and it makes them try to get an espresso at a later point. This is clearly better, as the current solution means they will never know that they will not get their espresso.&#x3C;/p&#x3E;&#x3C;p&#x3E;To achieve this, let&#x2019;s recover from &#x3C;code&#x3E;AskTimeoutException&#x3C;/code&#x3E; failures by mapping them to &#x3C;code&#x3E;ComebackLater&#x3C;/code&#x3E; messages. The &#x3C;code&#x3E;Receive&#x3C;/code&#x3E; partial function of our &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; actor thus now looks like this:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;val&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;register&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;?&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Transaction&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Espresso&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;n&#x22;&#x3E;receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;map&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;((&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoCup&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Filled&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)).&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;recover&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;_:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;AskTimeoutException&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ComebackLater&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;pipeTo&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;sender&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ClosingTime&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;shutdown&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;()&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;Now, the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actors know they can try their luck later, and after trying often enough, they should finally get their eagerly anticipated espresso.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Death Watch&#x3C;/h3&#x3E;&#x3C;p&#x3E;Another principle that is important in order to keep your system fault-tolerant is to keep a watch on important dependencies &#x2013; dependencies as opposed to children.&#x3C;/p&#x3E;&#x3C;p&#x3E;Sometimes, you have actors that depend on other actors without the latter being their children. This means that they can&#x2019;t be their supervisors. Yet, it is important to keep a watch on their state and be notified if bad things happen.&#x3C;/p&#x3E;&#x3C;p&#x3E;Think, for instance, of an actor that is responsible for database access. You will want actors that require this actor to be alive and healthy to know when that is no longer the case. Maybe you want to switch your system to a maintenance mode in such a situation. For other use cases, simply using some kind of backup actor as a replacement for the dead actor may be a viable solution.&#x3C;/p&#x3E;&#x3C;p&#x3E;In any case, you will need to place a watch on an actor you depend on in order to get the sad news of its passing away. This is done by calling the &#x3C;code&#x3E;watch&#x3C;/code&#x3E; method defined on &#x3C;code&#x3E;ActorContext&#x3C;/code&#x3E;. To illustrate, let&#x2019;s have our &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actors watch the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; &#x2013; they are highly addicted to caffeine, so it&#x2019;s fair to say they depend on the barista:&#x3C;/p&#x3E;&#x3C;figure class=&#x22;code&#x22;&#x3E;&#x3C;div class=&#x22;highlight&#x22;&#x3E;&#x3C;table&#x3E;&#x3C;tr&#x3E;&#x3C;td class=&#x22;gutter&#x22;&#x3E;&#x3C;pre class=&#x22;line-numbers&#x22;&#x3E;&#x3C;span class=&#x22;line-number&#x22;&#x3E;1&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;2&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;3&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;4&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;5&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;6&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;7&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;8&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;9&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;10&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;11&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;12&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;13&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;14&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;15&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;16&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;17&#x3C;/span&#x3E;
&#x3C;span class=&#x22;line-number&#x22;&#x3E;18&#x3C;/span&#x3E;
&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;td class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;scala&#x22;&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Customer&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;coffeeSource&#x3C;/span&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;:&#x3C;/span&#x3E; &#x3C;span class=&#x22;kt&#x22;&#x3E;ActorRef&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;extends&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Actor&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;with&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ActorLogging&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;import&#x3C;/span&#x3E; &#x3C;span class=&#x22;nn&#x22;&#x3E;context.dispatcher&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;watch&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;coffeeSource&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;k&#x22;&#x3E;def&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;receive&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;CaffeineWithdrawalWarning&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E; &#x3C;span class=&#x22;n&#x22;&#x3E;coffeeSource&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoCup&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;nc&#x22;&#x3E;Filled&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;),&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Receipt&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;amount&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;))&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;s&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;yay, caffeine for ${self}!&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;ComebackLater&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;grumble, grumble&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;context&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;system&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;scheduler&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;scheduleOnce&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;mf&#x22;&#x3E;300.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;millis&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;{&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;        &#x3C;span class=&#x22;n&#x22;&#x3E;coffeeSource&#x3C;/span&#x3E; &#x3C;span class=&#x22;o&#x22;&#x3E;!&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;EspressoRequest&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;    &#x3C;span class=&#x22;k&#x22;&#x3E;case&#x3C;/span&#x3E; &#x3C;span class=&#x22;nc&#x22;&#x3E;Terminated&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;barista&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E; &#x3C;span class=&#x22;k&#x22;&#x3E;=&#x3E;&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;      &#x3C;span class=&#x22;n&#x22;&#x3E;log&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;.&#x3C;/span&#x3E;&#x3C;span class=&#x22;n&#x22;&#x3E;info&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;(&#x3C;/span&#x3E;&#x3C;span class=&#x22;s&#x22;&#x3E;&#x22;Oh well, let&#x27;s find another coffeehouse...&#x22;&#x3C;/span&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;)&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;  &#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;span class=&#x22;line&#x22;&#x3E;&#x3C;span class=&#x22;o&#x22;&#x3E;}&#x3C;/span&#x3E;
&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/td&#x3E;&#x3C;/tr&#x3E;&#x3C;/table&#x3E;&#x3C;/div&#x3E;&#x3C;/figure&#x3E;&#x3C;p&#x3E;We start watching our &#x3C;code&#x3E;coffeeSource&#x3C;/code&#x3E; in our constructor, and we added a new case for messages of type &#x3C;code&#x3E;Terminated&#x3C;/code&#x3E; &#x2013; this is the kind of message we will receive from Akka if an actor we watch dies.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, if we send a &#x3C;code&#x3E;ClosingTime&#x3C;/code&#x3E; to the message and the &#x3C;code&#x3E;Barista&#x3C;/code&#x3E; tells its context to stop itself, the &#x3C;code&#x3E;Customer&#x3C;/code&#x3E; actors will be notified. Give it a try, and you should see their output in the log.&#x3C;/p&#x3E;&#x3C;p&#x3E;Instead of simply logging that we are not amused, this could just as well initiate some failover logic, for instance.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Summary&#x3C;/h2&#x3E;&#x3C;p&#x3E;In this part of the series, which is the second one dealing with actors and Akka, you got to know some of the important components of an actor system, all while learning how to put the tools provided by Akka and the ideas behind it to use in order to make your system more fault-tolerant.&#x3C;/p&#x3E;&#x3C;p&#x3E;While there is still a lot more to learn about the actor model and Akka, we shall leave it at that for now, as this would go beyond the scope of this series. In the next part, which shall bring this series to a conclusion, I will point you to a bunch of Scala resources you may want to peruse to continue your journey through Scala land, and if actors and Akka got you excited, there will be something in there for you, too.&#x3C;/p&#x3E;&#x3C;/div&#x3E;</description>
<pubDate>Thu, 12 Dec 2013 14:00:12 -0000</pubDate>
</item>
<item>
<title>The Neophyte&#x27;s Guide to Scala Part 16: Where to Go from Here - Daniel Westheide</title>
<link>http://danielwestheide.com/blog/2013/04/03/the-neophytes-guide-to-scala-part-16-where-to-go-from-here.html</link>
<description>&#x3C;div class=&#x22;entry-content&#x22;&#x3E;&#x3C;p&#x3E;As I have already hinted at in the previous article, the &#x3C;em&#x3E;Neophyte&#x2019;s Guide to Scala&#x3C;/em&#x3E; is coming to an end. Over the last five months, we have delved into numerous language and library features of Scala, hopefully deepening your understanding of those features and their underlying ideas and concepts.&#x3C;/p&#x3E;&#x3C;p&#x3E;As such, I hope this guide has served you well as a supplement to whatever introductory resources you have been using to learn Scala, whether you attended the &#x3C;a href=&#x22;https://www.coursera.org/course/progfun&#x22;&#x3E;Scala course at Coursera&#x3C;/a&#x3E; or learned from a book. I have tried to cover all the quirks I stumbled over back when I learned the language &#x2013; things that were only mentioned briefly or not covered at all in the books and tutorials available to me &#x2013; and I hope that especially those explanations were of value to you.&#x3C;/p&#x3E;&#x3C;p&#x3E;As the series progressed, we ventured into more advanced territory, covering ideas like type classes and path-dependent types. While I could go on writing about more and more arcane features, I felt like this would go against the idea of this series, which is clearly targeted at aspiring neophytes.&#x3C;/p&#x3E;&#x3C;p&#x3E;Hence, I will conclude this series with some suggestions of where to go from here if you want more. Rest assured that I will continue blogging about Scala, just not within the context of this series.&#x3C;/p&#x3E;&#x3C;p&#x3E;How you want to continue your journey with Scala, of course, depends a lot on your individual preferences: Maybe you are now at a point where you would like to &#x3C;strong&#x3E;teach Scala to others&#x3C;/strong&#x3E;, or maybe you are excited about Scala&#x2019;s type system and would like to explore some of the language&#x2019;s more arcane features by delving into &#x3C;strong&#x3E;type-level programming&#x3C;/strong&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;More often than not, a good way to really get comfortable with a new language and its whole ecosystem of libraries is to use it for &#x3C;strong&#x3E;creating something useful&#x3C;/strong&#x3E;, i.e. a real application that is more than just toying around. Personally, I have also gained a lot from &#x3C;strong&#x3E;contributing&#x3C;/strong&#x3E; to open source projects early on.&#x3C;/p&#x3E;&#x3C;p&#x3E;In the following, I will elaborate those four paths, which, of course, are not mutually exclusive, and provide you with numerous links to highly recommendable additional resources.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Teaching Scala&#x3C;/h2&#x3E;&#x3C;p&#x3E;Having followed this series, you should be familiar enough with Scala to be able to teach the basics. Maybe you are in a Java or Ruby shop and want to get your coworkers excited about Scala and functional programming.&#x3C;/p&#x3E;&#x3C;p&#x3E;Great, then why not organize a workshop? A nice way of introducing people to a new language is to not do a talk with lots of slides, but to teach by example, introducing a language in small steps by solving tiny problems together. Active participation is key!&#x3C;/p&#x3E;&#x3C;p&#x3E;If that&#x2019;s something you&#x2019;d like to do, the Scala community has you covered. Have a look at &#x3C;a href=&#x22;http://www.scalakoans.org/&#x22;&#x3E;Scala Koans&#x3C;/a&#x3E;, a collection of small lessons, each of which provides a problem to be solved by fixing an initially failing test. The project is inspired by the &#x3C;a href=&#x22;http://rubykoans.com/&#x22;&#x3E;Ruby Koans&#x3C;/a&#x3E; project and is a really good resource for teaching the language to others in small collaborative coding sessions.&#x3C;/p&#x3E;&#x3C;p&#x3E;Another amazing project ideally suited for workshops or other events is &#x3C;a href=&#x22;http://scalatron.github.com/&#x22;&#x3E;Scalatron&#x3C;/a&#x3E;, a game in which bots fight against each other in a virtual arena. Why not teach the language by developing such a bot together in a workshop, that will then fight against the computer? Once the participants are familiar enough with the language, organize a tournament, where each participant will develop their own bot.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Mastering arcane powers&#x3C;/h2&#x3E;&#x3C;p&#x3E;We have only seen a tiny bit of what the Scala type system allows you to do. If this small hint at the high wizardry that&#x2019;s possible got you excited and you want to master the arcane powers of type-level programming, a good starting resource is the blog series &#x3C;a href=&#x22;http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/&#x22;&#x3E;Type-Level Programming in Scala&#x3C;/a&#x3E; by Mark Harrah.&#x3C;/p&#x3E;&#x3C;p&#x3E;After that, I recommend to have a look at &#x3C;a href=&#x22;https://github.com/milessabin/shapeless&#x22;&#x3E;Shapeless&#x3C;/a&#x3E;, a library in which Miles Sabin explores the limits of the Scala language in terms of generic and polytypic programming.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Creating something useful&#x3C;/h2&#x3E;&#x3C;p&#x3E;Reading books, doing tutorials and toying around with a new language is all fine to get a certain understanding of it, but in order to become really comfortable with Scala and its paradigm and learn how to think the Scala way, I highly recommend that you start creating something useful with it &#x2013; something that is clearly more than a toy application (this is true for learning any language, in my opinion).&#x3C;/p&#x3E;&#x3C;p&#x3E;By tackling a real-world problem and trying to create a useful and usable application, you will also get a good overview of the ecosystem of libraries and get a feeling for which of those can be of service to you in specific situations.&#x3C;/p&#x3E;&#x3C;p&#x3E;In order to find relevant libraries or get updates of ones you are interested in, you should subscribe to &#x3C;a href=&#x22;http://notes.implicit.ly/&#x22;&#x3E;implicit.ly&#x3C;/a&#x3E; and regularly take a look at &#x3C;a href=&#x22;https://github.com/languages/Scala&#x22;&#x3E;Scala projects on GitHub&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;h3&#x3E;It&#x2019;s all about the web&#x3C;/h3&#x3E;&#x3C;p&#x3E;These days, most applications written in Scala will be some kind of server applications, often with a RESTful interface exposed via HTTP and a web frontend.&#x3C;/p&#x3E;&#x3C;p&#x3E;If the actor model for concurrency is a good fit for your use case and you hence choose to use the &#x3C;a href=&#x22;http://akka.io&#x22;&#x3E;Akka&#x3C;/a&#x3E; toolkit, an excellent choice for exposing a REST API via HTTP is &#x3C;a href=&#x22;http://spray.io/documentation/spray-routing/&#x22;&#x3E;Spray Routing&#x3C;/a&#x3E;. This is a great tool if you don&#x2019;t need a web frontend, or if you want to develop a single-page web application that will talk to your backend by means of a REST API.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you need something less minimalistic, of course, &#x3C;a href=&#x22;http://playframework.org&#x22;&#x3E;Play&#x3C;/a&#x3E;, which is part of the Typesafe stack, is a good choice, especially if you seek something that is widely adopted and hence well supported.&#x3C;/p&#x3E;&#x3C;h3&#x3E;Living in a concurrent world&#x3C;/h3&#x3E;&#x3C;p&#x3E;If after our two parts on actors and Akka, you think that Akka is a good fit for your application, you will likely want to learn a lot more about it before getting serious with it.&#x3C;/p&#x3E;&#x3C;p&#x3E;While the &#x3C;a href=&#x22;http://akka.io/docs/&#x22;&#x3E;Akka documentation&#x3C;/a&#x3E; is pretty exhaustive and thus serves well as a reference, I think that the best choice for actually &#x3C;em&#x3E;learning&#x3C;/em&#x3E; Akka is Derek Wyatt&#x2019;s book &#x3C;a href=&#x22;http://www.artima.com/shop/akka_concurrency&#x22;&#x3E;Akka Concurrency&#x3C;/a&#x3E;, a preliminary version of which is already available as a PDF.&#x3C;/p&#x3E;&#x3C;p&#x3E;Once you have got serious with Akka, you should definitely subscribe to &#x3C;a href=&#x22;http://letitcrash.com/&#x22;&#x3E;Let It Crash&#x3C;/a&#x3E;, which provides you with news and advanced tips and tricks and regarding all things Akka.&#x3C;/p&#x3E;&#x3C;p&#x3E;If actors are not your thing and you prefer a concurrency model allowing you to leverage the composability of &#x3C;em&#x3E;Futures&#x3C;/em&#x3E;, your library of choice is probably Twitter&#x2019;s &#x3C;a href=&#x22;http://twitter.github.com/finagle&#x22;&#x3E;Finagle&#x3C;/a&#x3E;. It allows you to modularize your application as a bunch of small remote services, with support for numerous popular protocols out of the box.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Contributing&#x3C;/h2&#x3E;&#x3C;p&#x3E;Another really great way to learn a lot about Scala quickly is to start contributing to one or more open source projects &#x2013; preferably to libraries you have been using while working on your own application.&#x3C;/p&#x3E;&#x3C;p&#x3E;Of course, this is nothing that is specific to Scala, but still I think it deserves to be mentioned. If you have only just learned Scala and are not using it at your day job already, it&#x2019;s nearly the only choice you have to learn from other, more experienced Scala developers.&#x3C;/p&#x3E;&#x3C;p&#x3E;It forces you to read a lot of Scala code from other people, discovering how to do things differently, possibly more idiomatically, and you can have those experienced developers review your code in pull requests.&#x3C;/p&#x3E;&#x3C;p&#x3E;I have found the Scala community at large to be very friendly and helpful, so don&#x2019;t shy away from contributing, even if you think you&#x2019;re too much of a rookie when it comes to Scala.&#x3C;/p&#x3E;&#x3C;p&#x3E;While some projects might have their own way of doing things, it&#x2019;s certainly a good idea to study the &#x3C;a href=&#x22;http://docs.scala-lang.org/style/&#x22;&#x3E;Scala Style Guide&#x3C;/a&#x3E; to get familiar with common coding conventions.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Connecting&#x3C;/h2&#x3E;&#x3C;p&#x3E;By contributing to open source projects, you have already started connecting with the Scala community. However, you may not have the time to do that, or you may prefer other ways of connecting to like-minded people.&#x3C;/p&#x3E;&#x3C;p&#x3E;Try finding a local Scala user group or meetup. &#x3C;a href=&#x22;http://www.scala-tribes.org&#x22;&#x3E;Scala Tribes&#x3C;/a&#x3E; provides an overview of Scala communities across the globe, and the &#x3C;a href=&#x22;http://lanyrd.com/topics/scala/&#x22;&#x3E;Scala topic at Lanyrd&#x3C;/a&#x3E; keeps you up-to-date on any kind of Scala-related event, from conferences to meetups.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you don&#x2019;t like connecting in meatspace, the &#x3C;a href=&#x22;https://groups.google.com/forum/#!forum/scala-user&#x22;&#x3E;scala-user mailing list/Google group&#x3C;/a&#x3E; and the &#x3C;a href=&#x22;irc://irc.freenode.net/scala&#x22;&#x3E;Scala IRC channel on Freenode&#x3C;/a&#x3E; may be good alternatives.&#x3C;/p&#x3E;&#x3C;h2&#x3E;Other resources&#x3C;/h2&#x3E;&#x3C;p&#x3E;Regardless of which of the paths outlined above you follow, there are a few resources I would like to recommend:&#x3C;/p&#x3E;&#x3C;ul&#x3E;&#x3C;li&#x3E;&#x3C;a href=&#x22;http://www.manning.com/bjarnason/&#x22;&#x3E;Functional Programming in Scala&#x3C;/a&#x3E; by Paul Chiusano and R&#xFA;nar Bjarnason, which is currently available as an Early Access Edition and teaches you a lot more about functional programming and thinking about problems with a functional mindset.&#x3C;/li&#x3E;&#x3C;li&#x3E;The &#x3C;a href=&#x22;http://docs.scala-lang.org/&#x22;&#x3E;Scala Documentation Site&#x3C;/a&#x3E;, which, for some reason, is not linked very prominently from the main Scala website, especially the available &#x3C;a href=&#x22;http://docs.scala-lang.org/overviews/&#x22;&#x3E;guides&#x3C;/a&#x3E; and &#x3C;a href=&#x22;http://docs.scala-lang.org/tutorials/&#x22;&#x3E;tutorials&#x3C;/a&#x3E;.&#x3C;/li&#x3E;&#x3C;li&#x3E;&#x3C;a href=&#x22;http://nerd.kelseyinnis.com/blog/2013/01/07/resources-for-getting-started-with-functional-programming-and-scala/&#x22;&#x3E;Resources for Getting Started With Functional Programming and Scala&#x3C;/a&#x3E; by Kelsey Innis contains a lot more helpful links about some of the topics we covered in this series.&#x3C;/li&#x3E;&#x3C;/ul&#x3E;&#x3C;h2&#x3E;Conclusion&#x3C;/h2&#x3E;&#x3C;p&#x3E;I hope you have enjoyed this series and that I could get you excited about Scala. While this series is coming to an end, I seriously hope that it&#x2019;s just the beginning of your journey through Scala land. Let me know in the comments how your journey went so far and where you think it will go from here.&#x3C;/p&#x3E;&#x3C;/div&#x3E;</description>
<pubDate>Mon, 16 Dec 2013 14:00:13 -0000</pubDate>
</item>
</channel>
</rss>