<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>λ Tony’s blog λ</title>
	<atom:link href="http://blog.tmorris.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tmorris.net</link>
	<description>The weblog of Tony Morris</description>
	<pubDate>Wed, 01 Sep 2010 23:54:25 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Even Further Understanding scala.Option (part 2)</title>
		<link>http://blog.tmorris.net/even-further-understanding-scalaoption-part-2/</link>
		<comments>http://blog.tmorris.net/even-further-understanding-scalaoption-part-2/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 05:45:27 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=812</guid>
		<description><![CDATA[As a follow-on to Further Understanding scala.Option, following are another 10 exercises (numbered 16 to 25). Included are solutions to the original 1 to 15 exercises. Instructions are in the comments.

// Scala version 2.8.0.final
// http://scala-tools.org/repo-releases/org/scala-tools/testing/scalacheck_2.8.0/1.7/scalacheck_2.8.0-1.7.jar
&#160;
&#160;
/*
&#160;
  PART 1
  ======
  Below are 15 exercises numbered 1 to 15. The task is to emulate the [...]]]></description>
			<content:encoded><![CDATA[<p>As a follow-on to <a href="http://blog.tmorris.net/further-understanding-scalaoption/" >Further Understanding scala.Option</a>, following are another 10 exercises (numbered 16 to 25). Included are solutions to the original 1 to 15 exercises. Instructions are in the comments.</p>

<div class="wp_syntax"><div class="code"><pre class="scala"><span style="color: #008000; font-style: italic;">// Scala version 2.8.0.final</span>
<span style="color: #008000; font-style: italic;">// http://scala-tools.org/repo-releases/org/scala-tools/testing/scalacheck_2.8.0/1.7/scalacheck_2.8.0-1.7.jar</span>
&nbsp;
&nbsp;
<span style="color: #00ff00; font-style: italic;">/*
&nbsp;
  PART 1
  ======
  Below are 15 exercises numbered 1 to 15. The task is to emulate the scala.Option API
  without using Some/None subtypes, but instead using a fold (called a
  catamorphism).
&nbsp;
  A couple of functions are already done (map, get)
  to be used as an example. ScalaCheck tests are given below to
  verify the work. The desired result is to have all tests passing.
&nbsp;
  The 15th exercise is not available in the existing Scala API so
  instructions are given in the comments.
&nbsp;
&nbsp;
  Part 2
  ======
&nbsp;
  Below are 10 exercises numbered 16 to 25. The task is to implement additional
  methods for the Optional data type. These methods are not provided in the
  scala.Option API so to determine the correct result requires reading the method
  type signature and ensuring that the tests pass.
&nbsp;
  The 25th exercise is notable in that its signature says nothing about
  scala.Option yet it is usable for Option (see the test for example).
&nbsp;
&nbsp;
  Revision History
  ================
&nbsp;
  23/08/2010
  * Initial revision
&nbsp;
  ----------------
&nbsp;
  23/08/2010
  * Fixed prop_getOrElse. Thanks Michael Bayne.
&nbsp;
  ----------------
&nbsp;
  26/08/2010
  * Add lazy annotation to orElse method.
&nbsp;
  ----------------
&nbsp;
  01/09/2010
  Added Part 2
&nbsp;
  02/09/2010
  * Fixed mapOptionals test (why wasn't it failing?). Thanks Alec Zorab.
  * Added comments including *** special note ***
&nbsp;
*/</span>
&nbsp;
&nbsp;
<span style="color: #0000ff; font-weight: bold;">trait</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
  <span style="color: #008000; font-style: italic;">// single abstract method</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> fold<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>some<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> X, none<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> X
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">import</span> Optional.<span style="color: #000080;">_</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Done for you.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> map<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>f andThen some, none<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Done for you.</span>
  <span style="color: #008000; font-style: italic;">// WARNING: undefined for None</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> get<span style="color: #000080;">:</span> A <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>a <span style="color: #000080;">=&gt;</span> a, error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;None.get&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 1</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> flatMap<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>f, none<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 2</span>
  <span style="color: #008000; font-style: italic;">// Rewrite map but use flatMap, not fold.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> mapAgain<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    flatMap<span style="color: #F78811;">&#40;</span>f andThen some<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 3</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> getOrElse<span style="color: #F78811;">&#40;</span>e<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> A <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>s <span style="color: #000080;">=&gt;</span> s, e<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 4</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> filter<span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>a <span style="color: #000080;">=&gt;</span> <span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>p<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span> some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">else</span> none, none<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 5</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> exists<span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>p, <span style="color: #0000ff; font-weight: bold;">false</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 6</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> forall<span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>p, <span style="color: #0000ff; font-weight: bold;">true</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 7</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> foreach<span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Unit<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Unit <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>f, <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 8</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> isDefined<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span> <span style="color: #000080;">=&gt;</span> <span style="color: #0000ff; font-weight: bold;">true</span>, <span style="color: #0000ff; font-weight: bold;">false</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 9</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> isEmpty<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span> <span style="color: #000080;">=&gt;</span> <span style="color: #0000ff; font-weight: bold;">false</span>, <span style="color: #0000ff; font-weight: bold;">true</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 10</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> orElse<span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span> <span style="color: #000080;">=&gt;</span> <span style="color: #0000ff; font-weight: bold;">this</span>, o<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 11</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toLeft<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>right<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Either<span style="color: #F78811;">&#91;</span>A, X<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>Left<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>, Right<span style="color: #F78811;">&#40;</span>right<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 12</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toRight<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>left<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Either<span style="color: #F78811;">&#91;</span>X, A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>Right<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>, Left<span style="color: #F78811;">&#40;</span>left<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 13</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toList<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>, Nil<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 14</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> iterator<span style="color: #000080;">:</span> Iterator<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>Iterator.<span style="color: #000000;">single</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>, Iterator.<span style="color: #000000;">empty</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 15 The Clincher!</span>
  <span style="color: #008000; font-style: italic;">// Return a none value if either this or the argument is none.</span>
  <span style="color: #008000; font-style: italic;">// Otherwise apply the function to the argument in some.</span>
  <span style="color: #008000; font-style: italic;">// Don't be afraid to use functions you have written.</span>
  <span style="color: #008000; font-style: italic;">// Better style, more points!</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> applic<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    f flatMap map
&nbsp;
  <span style="color: #008000; font-style: italic;">// Utility</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toOption<span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> fold<span style="color: #F78811;">&#40;</span>Some<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>, None<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Utility</span>
  <span style="color: #0000ff; font-weight: bold;">override</span> <span style="color: #0000ff; font-weight: bold;">def</span> toString <span style="color: #000080;">=</span> 
    fold<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;some[&quot;</span> + <span style="color: #000080;">_</span> + <span style="color: #6666FF;">&quot;]&quot;</span>, <span style="color: #6666FF;">&quot;none&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Utility</span>
  <span style="color: #0000ff; font-weight: bold;">override</span> <span style="color: #0000ff; font-weight: bold;">def</span> equals<span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Any<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span>
    o.<span style="color: #000000;">isInstanceOf</span><span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">&amp;&amp;</span> <span style="color: #F78811;">&#123;</span>
      <span style="color: #0000ff; font-weight: bold;">val</span> q <span style="color: #000080;">=</span> o.<span style="color: #000000;">asInstanceOf</span><span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span>
      fold<span style="color: #F78811;">&#40;</span>a <span style="color: #000080;">=&gt;</span> q.<span style="color: #000000;">exists</span><span style="color: #F78811;">&#40;</span>a <span style="color: #000080;">==</span> <span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>,
           q.<span style="color: #000000;">isEmpty</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> Optional <span style="color: #F78811;">&#123;</span>
  <span style="color: #008000; font-style: italic;">// Done for you</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> none<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> fold<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>some<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> X, none<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> none
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Done for you</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> some<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> fold<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>some<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> X, none<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Utility</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> fromOption<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> o <span style="color: #0000ff; font-weight: bold;">match</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">case</span> None    <span style="color: #000080;">=&gt;</span> none
    <span style="color: #0000ff; font-weight: bold;">case</span> Some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// *** Special note ***</span>
  <span style="color: #008000; font-style: italic;">// Some of these functions are likely to be familiar List functions,</span>
  <span style="color: #008000; font-style: italic;">// but with one specific distinction: in every covariant value appearing in</span>
  <span style="color: #008000; font-style: italic;">// the type signature, this value is wrapped in Optional.</span>
  <span style="color: #008000; font-style: italic;">// For example, the unwrapped:</span>
  <span style="color: #008000; font-style: italic;">// filter:          (A =&gt; Boolean) =&gt; List[A] =&gt; List[A]</span>
  <span style="color: #008000; font-style: italic;">// and the wrapped:</span>
  <span style="color: #008000; font-style: italic;">// filterOptionals: (A =&gt; Optional[Boolean]) =&gt; List[A] =&gt; Optional[List[A]]</span>
  <span style="color: #008000; font-style: italic;">// </span>
  <span style="color: #008000; font-style: italic;">// There are other functions of a similar nature below.</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 16</span>
  <span style="color: #008000; font-style: italic;">// If a none is encountered, then return a none, otherwise,</span>
  <span style="color: #008000; font-style: italic;">// accumulate all the values in Optional.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> mapOptionals<span style="color: #F78811;">&#91;</span>A, B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 17</span>
  <span style="color: #008000; font-style: italic;">// If a none is encountered, then return a none, otherwise,</span>
  <span style="color: #008000; font-style: italic;">// accumulate all the values in Optional.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> sequenceOptionals<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 18</span>
  <span style="color: #008000; font-style: italic;">// Use sequenceOptionals</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> mapOptionalsAgain<span style="color: #F78811;">&#91;</span>A, B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 19 </span>
  <span style="color: #008000; font-style: italic;">// Use mapOptionals</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> sequenceOptionalsAgain<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 20</span>
  <span style="color: #008000; font-style: italic;">// If a none is encountered, return none, otherwise,</span>
  <span style="color: #008000; font-style: italic;">// flatten/join by one level.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> joinOptionals<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 21</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> filterOptionals<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 22</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> fillOptionals<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span>, a<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 23</span>
  <span style="color: #008000; font-style: italic;">// Use sequenceOptionals</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> fillOptionalsAgain<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span>, a<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 24</span>
  <span style="color: #008000; font-style: italic;">// Methods mentioning Optional in the type signature are prohibited, except applic and map</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> mapOptionalsYetAgain<span style="color: #F78811;">&#91;</span>A, B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Consider: def joinOptional[A](a: Optional[Optional[A]]): Optional[A]</span>
  <span style="color: #008000; font-style: italic;">// This function &quot;flattens&quot; the Optional into a Some value if possible.</span>
  <span style="color: #008000; font-style: italic;">// It is not possible to write this using only applic and map (try it!).</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Bye bye Option-specificity!</span>
  <span style="color: #008000; font-style: italic;">// (setting up for Exercise 25)</span>
  <span style="color: #0000ff; font-weight: bold;">trait</span> Applic<span style="color: #F78811;">&#91;</span>F<span style="color: #F78811;">&#91;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> point<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> applic<span style="color: #F78811;">&#91;</span>A, B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span>
&nbsp;
    <span style="color: #0000ff; font-weight: bold;">final</span> <span style="color: #0000ff; font-weight: bold;">def</span> map<span style="color: #F78811;">&#91;</span>A, B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> B, a<span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
      applic<span style="color: #F78811;">&#40;</span>point<span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#41;</span>, a<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">object</span> Applic <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">implicit</span> <span style="color: #0000ff; font-weight: bold;">val</span> OptionalApplic<span style="color: #000080;">:</span> Applic<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Applic<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
      <span style="color: #0000ff; font-weight: bold;">def</span> point<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
      <span style="color: #0000ff; font-weight: bold;">def</span> applic<span style="color: #F78811;">&#91;</span>A, B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> a applic f
    <span style="color: #F78811;">&#125;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 25</span>
  <span style="color: #008000; font-style: italic;">// The Double-Clincher!</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> mapWhatever<span style="color: #F78811;">&#91;</span>A, B, F<span style="color: #F78811;">&#91;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> F<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span>, a<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">implicit</span> z<span style="color: #000080;">:</span> Applic<span style="color: #F78811;">&#91;</span>F<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> F<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">import</span> org.<span style="color: #000000;">scalacheck</span>.<span style="color: #000080;">_</span>
<span style="color: #0000ff; font-weight: bold;">import</span> Arbitrary.<span style="color: #000000;">arbitrary</span>
<span style="color: #0000ff; font-weight: bold;">import</span> Prop.<span style="color: #000080;">_</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> TestOptional <span style="color: #0000ff; font-weight: bold;">extends</span> Properties<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Optional&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
  <span style="color: #0000ff; font-weight: bold;">import</span> Optional.<span style="color: #000080;">_</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">implicit</span> <span style="color: #0000ff; font-weight: bold;">def</span> ArbitraryOptional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">implicit</span> a<span style="color: #000080;">:</span> Arbitrary<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Arbitrary<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    Arbitrary<span style="color: #F78811;">&#40;</span>arbitrary<span style="color: #F78811;">&#91;</span>Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> map fromOption<span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;map&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o map f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> map f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;get&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">isDefined</span> <span style="color: #000080;">==&gt;</span>
      <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">get</span> <span style="color: #000080;">==</span> o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">get</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;flatMap&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o flatMap f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> flatMap <span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;mapAgain&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o mapAgain f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o map f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;getOrElse&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o getOrElse n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> getOrElse n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;filter&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o filter f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> filter f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;exists&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o exists f<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> exists f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;forall&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o forall f<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> forall f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;foreach&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Unit, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">var</span> x<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=</span> n
    <span style="color: #0000ff; font-weight: bold;">var</span> y<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=</span> x
&nbsp;
    o foreach <span style="color: #F78811;">&#40;</span>t <span style="color: #000080;">=&gt;</span> x <span style="color: #000080;">=</span> x + t<span style="color: #F78811;">&#41;</span>
    o.<span style="color: #000000;">toOption</span> foreach <span style="color: #F78811;">&#40;</span>t <span style="color: #000080;">=&gt;</span> y <span style="color: #000080;">=</span> y + t<span style="color: #F78811;">&#41;</span>
&nbsp;
    x <span style="color: #000080;">==</span> y
  <span style="color: #F78811;">&#125;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;isDefined&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">isDefined</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">isDefined</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;isEmpty&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">isEmpty</span> <span style="color: #000080;">==</span> o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">isEmpty</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;orElse&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, p<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o orElse p<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> orElse p.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;toLeft&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o toLeft n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> toLeft n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;toRight&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o toRight n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> toRight n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;toList&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">toList</span> <span style="color: #000080;">==</span> o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">toList</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;iterator&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">iterator</span> sameElements o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">iterator</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// *** READ THIS COMMENT FIRST ***</span>
  <span style="color: #008000; font-style: italic;">// Note that scala.Option has no such equivalent to this method</span>
  <span style="color: #008000; font-style: italic;">// Therefore, reading this test may give away clues to how it might be solved.</span>
  <span style="color: #008000; font-style: italic;">// If you do not wish to spoil it, look away now and follow the</span>
  <span style="color: #008000; font-style: italic;">// instruction in the Exercise comment.</span>
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;applic&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> String<span style="color: #F78811;">&#93;</span>, p<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>p applic o<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span>
    <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">for</span><span style="color: #F78811;">&#40;</span>f <span style="color: #000080;">&lt;</span>- o.<span style="color: #000000;">toOption</span><span style="color: #000080;">;</span>
         n <span style="color: #000080;">&lt;</span>- p.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #0000ff; font-weight: bold;">yield</span> f<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> trace<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    println<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
    a
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;mapOptionals&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span>, o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
  <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">val</span> i <span style="color: #000080;">=</span> o map f
    mapOptionals<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>i forall <span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">isDefined</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span> some<span style="color: #F78811;">&#40;</span>i map <span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">get</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">else</span> none<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;sequenceOptionals&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      sequenceOptionals<span style="color: #F78811;">&#40;</span>o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>o exists <span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">isEmpty</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span> none <span style="color: #0000ff; font-weight: bold;">else</span> some<span style="color: #F78811;">&#40;</span>o map <span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">get</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;mapOptionalsAgain&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span>, o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      mapOptionalsAgain<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> mapOptionals<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;sequenceOptionalsAgain&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      sequenceOptionalsAgain<span style="color: #F78811;">&#40;</span>o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> sequenceOptionals<span style="color: #F78811;">&#40;</span>o<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;joinOptionals&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      joinOptionals<span style="color: #F78811;">&#40;</span>o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">isDefined</span> <span style="color: #000080;">&amp;&amp;</span> o.<span style="color: #000000;">get</span>.<span style="color: #000000;">isDefined</span><span style="color: #F78811;">&#41;</span> o.<span style="color: #000000;">get</span> <span style="color: #0000ff; font-weight: bold;">else</span> none<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;filterOptionals&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#93;</span>, o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      filterOptionals<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>o exists <span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">isEmpty</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span> none <span style="color: #0000ff; font-weight: bold;">else</span> some<span style="color: #F78811;">&#40;</span>o filter <span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">get</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;fillOptionals&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span>, o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      <span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">&lt;</span> <span style="color: #F78811;">1000</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==&gt;</span> <span style="color: #008000; font-style: italic;">// prevent stack consumption</span>
      <span style="color: #F78811;">&#40;</span>fillOptionals<span style="color: #F78811;">&#40;</span>n, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">&lt;=</span> <span style="color: #F78811;">0</span><span style="color: #F78811;">&#41;</span> some<span style="color: #F78811;">&#40;</span>Nil<span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">else</span> <span style="color: #F78811;">&#40;</span>o map <span style="color: #F78811;">&#40;</span>List.<span style="color: #000000;">fill</span><span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;fillOptionalsAgain&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span>, o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      <span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">&lt;</span> <span style="color: #F78811;">1000</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==&gt;</span> <span style="color: #008000; font-style: italic;">// prevent stack consumption      </span>
      <span style="color: #F78811;">&#40;</span>fillOptionalsAgain<span style="color: #F78811;">&#40;</span>n, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> fillOptionals<span style="color: #F78811;">&#40;</span>n, o<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;mapOptionalsYetAgain&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span>, o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      mapOptionalsYetAgain<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> mapOptionals<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  property<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;mapWhatever&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span>, o<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
      mapWhatever<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> mapOptionals<span style="color: #F78811;">&#40;</span>f, o<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #00ff00; font-style: italic;">/*
  $ scala -classpath .:scalacheck_2.8.0-1.7.jar TestOptional
  + Optional.map: OK, passed 100 tests.                                         
  + Optional.get: OK, passed 100 tests.                                         
  + Optional.flatMap: OK, passed 100 tests.                                     
  + Optional.mapAgain: OK, passed 100 tests.                                    
  + Optional.getOrElse: OK, passed 100 tests.                                   
  + Optional.filter: OK, passed 100 tests.                                      
  + Optional.exists: OK, passed 100 tests.                                      
  + Optional.forall: OK, passed 100 tests.                                      
  + Optional.foreach: OK, passed 100 tests.                                     
  + Optional.isDefined: OK, passed 100 tests.                                   
  + Optional.isEmpty: OK, passed 100 tests.                                     
  + Optional.orElse: OK, passed 100 tests.                                      
  + Optional.toLeft: OK, passed 100 tests.                                      
  + Optional.toRight: OK, passed 100 tests.                                     
  + Optional.toList: OK, passed 100 tests.                                      
  + Optional.iterator: OK, passed 100 tests.                                    
  + Optional.applic: OK, passed 100 tests.                                      
  + Optional.mapOptionals: OK, passed 100 tests.                                
  + Optional.sequenceOptionals: OK, passed 100 tests.                           
  + Optional.mapOptionalsAgain: OK, passed 100 tests.                           
  + Optional.sequenceOptionalsAgain: OK, passed 100 tests.                      
  + Optional.joinOptionals: OK, passed 100 tests.                               
  + Optional.filterOptionals: OK, passed 100 tests.                             
  + Optional.fillOptionals: OK, passed 100 tests.                          
  + Optional.fillOptionalsAgain: OK, passed 100 tests.                     
  + Optional.mapOptionalsYetAgain: OK, passed 100 tests.                        
  + Optional.mapWhatever: OK, passed 100 tests.          
  */</span>  
<span style="color: #F78811;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/even-further-understanding-scalaoption-part-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Can an entrapment neuropathy of the superficial peroneal nerve cause foot drop?</title>
		<link>http://blog.tmorris.net/can-an-entrapment-neuropathy-of-the-superficial-peroneal-nerve-cause-foot-drop/</link>
		<comments>http://blog.tmorris.net/can-an-entrapment-neuropathy-of-the-superficial-peroneal-nerve-cause-foot-drop/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 21:04:53 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Health]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=807</guid>
		<description><![CDATA[Of the 26 medical doctors I have met in the last couple of years, about 10 of them had this question before them in some way. All of them answered &#8220;no.&#8221; I am very confident this tiny sample set extrapolates &#8212; I doubt there is a doctor who would not say no.
They are all wrong.
Entrapment [...]]]></description>
			<content:encoded><![CDATA[<p>Of the 26 medical doctors I have met in the last couple of years, about 10 of them had this question before them in some way. All of them answered &#8220;no.&#8221; I am very confident this tiny sample set extrapolates &#8212; I doubt there is a doctor who would not say no.</p>
<p><strong>They are all wrong.</strong></p>
<p>Entrapment neuropathy of the superficial peroneal nerve is not a common condition, but one which I had after an ankle inversion sprain. The entrapment was 10cm proximal to the lateral malleolus at the deep fascia exit behind the peroneal muscles.</p>
<p>In order to achieve resolution of this problem, I had to publish an essay with citations and present it to several surgeons. My citations include every case study of this condition that currently exists and several orthopaedic text books.</p>
<p>My insistence that this was causing a significant problem and that I also had incomplete foot drop was met with deep scepticism. After all, the superficial peroneal nerve (SPN) is a cutaneous nerve that does not supply motor control. I knew this too of course, but I had no explanation. It is the deep peroneal nerve (DPN) which supplies motor control &#8212; the guy next door. Foot drop is often caused by an entrapment below and behind the knee before the nerve splits into these two branches, but I knew this was not the cause.</p>
<p>A marcaine/steroid injection into the SPN entrapment site immediately (within seconds) relieved some amount of foot drop. This too, was met with scepticism (?placebo), but I was adamant &#8212; there was an effect including a functional improvement.</p>
<p><strong>An entrapment neuropathy of the superficial peroneal can cause foot drop by extending the nerve, and placing traction on the L5 nerve root. This will result in the expected fibrillation of the foot extensor muscles. Further, this is an extremely painful and distressing condition resulting in symptoms that can be very distracting from the actual etiology.</strong></p>
<p><em>I am not a medical expert, just an independent thinker who owns too many medical text books. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/can-an-entrapment-neuropathy-of-the-superficial-peroneal-nerve-cause-foot-drop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Further understanding scala.Option</title>
		<link>http://blog.tmorris.net/further-understanding-scalaoption/</link>
		<comments>http://blog.tmorris.net/further-understanding-scalaoption/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 01:46:56 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=801</guid>
		<description><![CDATA[Below are 15 (probably fun) exercises for anyone interested in obtaining a deeper understanding of scala.Option and algebraic data types in general. I could write the same in Haskell but this will require either type-classes or rank-n types (GHC extension), so I thought I&#8217;d give that a miss.
Instructions are in the comments. Let me know [...]]]></description>
			<content:encoded><![CDATA[<p>Below are 15 (probably fun) exercises for anyone interested in obtaining a deeper understanding of <code>scala.Option</code> and algebraic data types in general. I could write the same in Haskell but this will require either type-classes or rank-n types (GHC extension), so I thought I&#8217;d give that a miss.</p>
<p>Instructions are in the comments. Let me know if there are any questions.</p>

<div class="wp_syntax"><div class="code"><pre class="scala"><span style="color: #008000; font-style: italic;">// Scala version 2.8.0.final</span>
<span style="color: #008000; font-style: italic;">// http://scalacheck.googlecode.com/files/scalacheck_2.8.0-1.8-SNAPSHOT.jar</span>
&nbsp;
&nbsp;
<span style="color: #00ff00; font-style: italic;">/*
&nbsp;
  Below are 15 exercises. The task is to emulate the scala.Option API
  without using Some/None subtypes, but instead using a fold (called a
  catamorphism).
&nbsp;
  A couple of functions are already done (map, get)
  to be used as an example. ScalaCheck tests are given below to
  verify the work. The desired result is to have all tests passing.
&nbsp;
  The 15th exercise is not available in the existing Scala API so
  instructions are given in the comments.
&nbsp;
  Revision History
  ================
&nbsp;
  23/08/2010
  Initial revision
&nbsp;
  ----------------
&nbsp;
  23/08/2010
  Fixed prop_getOrElse. Thanks Michael Bayne.
&nbsp;
  ----------------
&nbsp;
  26/08/2010
  Add lazy annotation to orElse method.
&nbsp;
*/</span>
&nbsp;
&nbsp;
<span style="color: #0000ff; font-weight: bold;">trait</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
  <span style="color: #008000; font-style: italic;">// single abstract method</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> fold<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>some<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> X, none<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> X
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">import</span> Optional.<span style="color: #000080;">_</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Done for you.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> map<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>f andThen some, none<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Done for you.</span>
  <span style="color: #008000; font-style: italic;">// WARNING: undefined for None</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> get<span style="color: #000080;">:</span> A <span style="color: #000080;">=</span>
    fold<span style="color: #F78811;">&#40;</span>a <span style="color: #000080;">=&gt;</span> a, error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;None.get&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 1</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> flatMap<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 2</span>
  <span style="color: #008000; font-style: italic;">// Rewrite map but use flatMap, not fold.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> mapAgain<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 3</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> getOrElse<span style="color: #F78811;">&#40;</span>e<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> A <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 4</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> filter<span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 5</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> exists<span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 6</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> forall<span style="color: #F78811;">&#40;</span>p<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 7</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> foreach<span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Unit<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Unit <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 8</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> isDefined<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 9</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> isEmpty<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 10</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> orElse<span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 11</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toLeft<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>right<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Either<span style="color: #F78811;">&#91;</span>A, X<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 12</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toRight<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>left<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Either<span style="color: #F78811;">&#91;</span>X, A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 13</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toList<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 14</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> iterator<span style="color: #000080;">:</span> Iterator<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 15 The Clincher!</span>
  <span style="color: #008000; font-style: italic;">// Return a none value if either this or the argument is none.</span>
  <span style="color: #008000; font-style: italic;">// Otherwise apply the function to the argument in some.</span>
  <span style="color: #008000; font-style: italic;">// Don't be afraid to use functions you have written.</span>
  <span style="color: #008000; font-style: italic;">// Better style, more points!</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> applic<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Utility</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> toOption<span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> fold<span style="color: #F78811;">&#40;</span>Some<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>, None<span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> Optional <span style="color: #F78811;">&#123;</span>
  <span style="color: #008000; font-style: italic;">// Done for you</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> none<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> fold<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>some<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> X, none<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> none
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Done for you</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> some<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> fold<span style="color: #F78811;">&#91;</span>X<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>some<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> X, none<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> X<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Utility</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> fromOption<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> o <span style="color: #0000ff; font-weight: bold;">match</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">case</span> None    <span style="color: #000080;">=&gt;</span> none
    <span style="color: #0000ff; font-weight: bold;">case</span> Some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">import</span> org.<span style="color: #000000;">scalacheck</span>.<span style="color: #000080;">_</span>
<span style="color: #0000ff; font-weight: bold;">import</span> Arbitrary.<span style="color: #000000;">arbitrary</span>
<span style="color: #0000ff; font-weight: bold;">import</span> Prop.<span style="color: #000080;">_</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> TestOptional <span style="color: #F78811;">&#123;</span>
  <span style="color: #0000ff; font-weight: bold;">import</span> Optional.<span style="color: #000080;">_</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">implicit</span> <span style="color: #0000ff; font-weight: bold;">def</span> ArbitraryOptional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">implicit</span> a<span style="color: #000080;">:</span> Arbitrary<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Arbitrary<span style="color: #F78811;">&#91;</span>Optional<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    Arbitrary<span style="color: #F78811;">&#40;</span>arbitrary<span style="color: #F78811;">&#91;</span>Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> map fromOption<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>map <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o map f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> map f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>get <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">isDefined</span> <span style="color: #000080;">==&gt;</span>
      <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">get</span> <span style="color: #000080;">==</span> o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">get</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>flatMap <span style="color: #000080;">=</span> forAll<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Optional<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o flatMap f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> flatMap <span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>mapAgain <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o mapAgain f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o map f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>getOrElse <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o getOrElse n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> getOrElse n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>filter <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o filter f<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> filter f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>exists <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o exists f<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> exists f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>forall <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> <span style="color: #9999cc; font-weight: bold;">Boolean</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o forall f<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> forall f<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>foreach <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> Unit, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">var</span> x<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=</span> n
    <span style="color: #0000ff; font-weight: bold;">var</span> y<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=</span> x
&nbsp;
    o foreach <span style="color: #F78811;">&#40;</span>t <span style="color: #000080;">=&gt;</span> x <span style="color: #000080;">=</span> x + t<span style="color: #F78811;">&#41;</span>
    o.<span style="color: #000000;">toOption</span> foreach <span style="color: #F78811;">&#40;</span>t <span style="color: #000080;">=&gt;</span> y <span style="color: #000080;">=</span> y + t<span style="color: #F78811;">&#41;</span>
&nbsp;
    x <span style="color: #000080;">==</span> y
  <span style="color: #F78811;">&#125;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>isDefined <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">isDefined</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">isDefined</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>isEmpty <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">isEmpty</span> <span style="color: #000080;">==</span> o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">isEmpty</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>orElse <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, p<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o orElse p<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> orElse p.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>toLeft <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o toLeft n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> toLeft n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>toRight <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span>, n<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>o toRight n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">&#40;</span>o.<span style="color: #000000;">toOption</span> toRight n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>toList <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">toList</span> <span style="color: #000080;">==</span> o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">toList</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>iterator <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    o.<span style="color: #000000;">iterator</span> sameElements o.<span style="color: #000000;">toOption</span>.<span style="color: #000000;">iterator</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// *** READ THIS COMMENT FIRST ***</span>
  <span style="color: #008000; font-style: italic;">// Note that scala.Option has no such equivalent to this method</span>
  <span style="color: #008000; font-style: italic;">// Therefore, reading this test may give away clues to how it might be solved.</span>
  <span style="color: #008000; font-style: italic;">// If you do not wish to spoil it, look away now and follow the </span>
  <span style="color: #008000; font-style: italic;">// instruction in the Exercise comment.</span>
  <span style="color: #0000ff; font-weight: bold;">val</span> prop<span style="color: #000080;">_</span>applic <span style="color: #000080;">=</span> forAll <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>o<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> String<span style="color: #F78811;">&#93;</span>, p<span style="color: #000080;">:</span> Optional<span style="color: #F78811;">&#91;</span><span style="color: #9999cc; font-weight: bold;">Int</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span>
    <span style="color: #F78811;">&#40;</span>p applic o<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">toOption</span> <span style="color: #000080;">==</span>
    <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">for</span><span style="color: #F78811;">&#40;</span>f <span style="color: #000080;">&lt;</span>- o.<span style="color: #000000;">toOption</span><span style="color: #000080;">;</span>
        n <span style="color: #000080;">&lt;</span>- p.<span style="color: #000000;">toOption</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #0000ff; font-weight: bold;">yield</span> f<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> props <span style="color: #000080;">=</span>
    List<span style="color: #F78811;">&#40;</span>
      prop<span style="color: #000080;">_</span>map,
      prop<span style="color: #000080;">_</span>get,
      prop<span style="color: #000080;">_</span>flatMap,
      prop<span style="color: #000080;">_</span>mapAgain,
      prop<span style="color: #000080;">_</span>getOrElse,
      prop<span style="color: #000080;">_</span>filter,
      prop<span style="color: #000080;">_</span>exists,
      prop<span style="color: #000080;">_</span>forall,
      prop<span style="color: #000080;">_</span>foreach,
      prop<span style="color: #000080;">_</span>isDefined,
      prop<span style="color: #000080;">_</span>isEmpty,
      prop<span style="color: #000080;">_</span>orElse,
      prop<span style="color: #000080;">_</span>toLeft,
      prop<span style="color: #000080;">_</span>toRight,
      prop<span style="color: #000080;">_</span>toList,
      prop<span style="color: #000080;">_</span>iterator,
      prop<span style="color: #000080;">_</span>applic
    <span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #00ff00; font-style: italic;">/*
  $ scala -classpath .:scalacheck_2.8.0-1.8-SNAPSHOT.jar TestOptional
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                                                       
  + OK, passed 100 tests.                       
  */</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> main<span style="color: #F78811;">&#40;</span>args<span style="color: #000080;">:</span> Array<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
    props foreach <span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">check</span><span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/further-understanding-scalaoption/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java and Practicality</title>
		<link>http://blog.tmorris.net/java-and-practicality/</link>
		<comments>http://blog.tmorris.net/java-and-practicality/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 23:27:10 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=797</guid>
		<description><![CDATA[I have found that those who advocate for the practicality of Java as a programming language for solving software problems invariably have an incredibly poor understanding of programming language theory and poor general problem solving skills. However, almost always, an even poorer understanding of the Java programming language itself is most prominent.
Consequently, one cannot have [...]]]></description>
			<content:encoded><![CDATA[<p>I have found that those who advocate for the practicality of Java as a programming language for solving software problems invariably have an incredibly poor understanding of programming language theory and poor general problem solving skills. However, almost always, an even poorer understanding of the Java programming language itself is most prominent.</p>
<p>Consequently, one cannot have a reasonable discussion about the merits of problem solving, using the Java programming language, or programming languages in general. However, one hopes that this sample set is biased and so one continues the search for a counter-example.</p>
<p>This is lamentable.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/java-and-practicality/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Functional Java 3.0</title>
		<link>http://blog.tmorris.net/functional-java-30/</link>
		<comments>http://blog.tmorris.net/functional-java-30/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 11:09:02 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=792</guid>
		<description><![CDATA[Functional Java 3.0 is released. As usual, requires any Java 1.5 (or above) runtime and the source can be compiled with any Java 1.5 compiler.
Support for Java 7 BGGA closures is dropped, since the function interfaces are now classes with abstract methods. Other useful additions abound. Have fun!
]]></description>
			<content:encoded><![CDATA[<p><a href="http://functionaljava.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/functionaljava.org');">Functional Java 3.0</a> is released. As usual, requires any Java 1.5 (or above) runtime and the source can be compiled with any Java 1.5 compiler.</p>
<p>Support for Java 7 BGGA closures is dropped, since the function interfaces are now classes with abstract methods. Other useful additions abound. Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/functional-java-30/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Understanding Monads using Scala (Part 1)</title>
		<link>http://blog.tmorris.net/understanding-monads-using-scala-part-1/</link>
		<comments>http://blog.tmorris.net/understanding-monads-using-scala-part-1/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 06:51:23 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=790</guid>
		<description><![CDATA[Below are three exercises using Scala. The instructions for each are in the comments. Exercises 1 and 2 must be completed before Exercise 3 (which is just a thinking exercise &#8212; no code).
A follow-on to these exercises will be coming.
Hope this helps!

// A typical data type with a single abstract method
case class Inter&#91;A&#93;&#40;f: Int =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Below are three exercises using Scala. The instructions for each are in the comments. Exercises 1 and 2 must be completed before Exercise 3 (which is just a thinking exercise &#8212; no code).</p>
<p>A follow-on to these exercises will be coming.</p>
<p>Hope this helps!</p>

<div class="wp_syntax"><div class="code"><pre class="scala"><span style="color: #008000; font-style: italic;">// A typical data type with a single abstract method</span>
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">class</span> Inter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #9999cc; font-weight: bold;">Int</span> <span style="color: #000080;">=&gt;</span> A<span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
  <span style="color: #008000; font-style: italic;">// which is a functor</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> map<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>g<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> B<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Inter<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    Inter<span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">=&gt;</span> g<span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// and a monad (see unital below)</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> flatMap<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>g<span style="color: #000080;">:</span> A <span style="color: #000080;">=&gt;</span> Inter<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Inter<span style="color: #F78811;">&#91;</span>B<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span> 
    Inter<span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">=&gt;</span> g<span style="color: #F78811;">&#40;</span>f<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">f</span><span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// unital: A =&gt; F[A]</span>
<span style="color: #008000; font-style: italic;">// Implementations for F=Option and F=Inter</span>
<span style="color: #0000ff; font-weight: bold;">object</span> Unitals <span style="color: #F78811;">&#123;</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> unitalOption<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    Some<span style="color: #F78811;">&#40;</span>a<span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> unitalInter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Inter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    Inter<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span> <span style="color: #000080;">=&gt;</span> a<span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Exercises</span>
<span style="color: #008000; font-style: italic;">// </span>
<span style="color: #008000; font-style: italic;">// It is recommended to use only map, flatMap and unital* for</span>
<span style="color: #008000; font-style: italic;">// Option or Inter when implementing the exercises below.</span>
<span style="color: #008000; font-style: italic;">// Any other libraries are acceptable (e.g. List functions).</span>
<span style="color: #0000ff; font-weight: bold;">object</span> Sequencing <span style="color: #F78811;">&#123;</span>
  <span style="color: #0000ff; font-weight: bold;">import</span> Unitals.<span style="color: #000080;">_</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 1 of 3</span>
  <span style="color: #008000; font-style: italic;">// ===============</span>
  <span style="color: #008000; font-style: italic;">// Implement a function that returns None if the given list</span>
  <span style="color: #008000; font-style: italic;">// contains any None values, otherwise, all the Some values.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> sequenceOption<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>x<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>Option<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>     
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
    <span style="color: #008000; font-style: italic;">// SOLUTIONx2 (ROT-13)</span>
    <span style="color: #00ff00; font-style: italic;">/*
    1)
    k.sbyqEvtug(havgnyBcgvba(Avy: Yvfg[N]))((n, o) =&gt; n syngZnc (k =&gt; o znc (k :: _)))
&nbsp;
    2)
    k zngpu {
      pnfr Avy  =&gt; havgnyBcgvba(Avy)
      pnfr u::g =&gt; u syngZnc (k =&gt; frdhraprBcgvba(g) znc (k :: _))
    }
    */</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 2 of 3</span>
  <span style="color: #008000; font-style: italic;">// ===============</span>
  <span style="color: #008000; font-style: italic;">// Implement a function that returns an Inter that applies an Int</span>
  <span style="color: #008000; font-style: italic;">// to all the Inter implementations in the List of Inters and returns</span>
  <span style="color: #008000; font-style: italic;">// all the results.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> sequenceInter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>x<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span>Inter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Inter<span style="color: #F78811;">&#91;</span>List<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>     
    error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;todo&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
    <span style="color: #008000; font-style: italic;">// SOLUTIONx2 (ROT-13)</span>
    <span style="color: #00ff00; font-style: italic;">/*
    1)
    k.sbyqEvtug(havgnyVagre(Avy: Yvfg[N]))((n, o) =&gt; n syngZnc (k =&gt; o znc (k :: _)))
&nbsp;
    2)
    k zngpu {
      pnfr Avy  =&gt; havgnyVagre(Avy)
      pnfr u::g =&gt; u syngZnc (k =&gt; frdhraprVagre(g) znc (k :: _))
    }
    */</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Exercise 3 of 3</span>
  <span style="color: #008000; font-style: italic;">// ===============</span>
  <span style="color: #008000; font-style: italic;">// There is repetition in the above exercises.</span>
  <span style="color: #008000; font-style: italic;">// How might we be rid of it?</span>
  <span style="color: #008000; font-style: italic;">// That is for Part 2.</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> main<span style="color: #F78811;">&#40;</span>args<span style="color: #000080;">:</span> Array<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> assertEquals<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a1<span style="color: #000080;">:</span> A, a2<span style="color: #000080;">:</span> A<span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
      <span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span>a1 <span style="color: #000080;">!=</span> a2<span style="color: #F78811;">&#41;</span>
        error<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Assertion error. Expected: &quot;</span> + a1 + <span style="color: #6666FF;">&quot; Actual: &quot;</span> + a2<span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
&nbsp;
    <span style="color: #0000ff; font-weight: bold;">def</span> assertInterEquals<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>a1<span style="color: #000080;">:</span> Inter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span>, a2<span style="color: #000080;">:</span> Inter<span style="color: #F78811;">&#91;</span>A<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
      <span style="color: #0000ff; font-weight: bold;">val</span> testInts <span style="color: #000080;">=</span> List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">1</span>, <span style="color: #F78811;">2</span>, <span style="color: #F78811;">0</span>, <span style="color: #F78811;">-7</span>, <span style="color: #F78811;">-9</span>, <span style="color: #F78811;">113</span>, <span style="color: #F78811;">-2048</span><span style="color: #F78811;">&#41;</span>
      assertEquals<span style="color: #F78811;">&#40;</span>testInts.<span style="color: #000000;">map</span><span style="color: #F78811;">&#40;</span>a1.<span style="color: #000000;">f</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>, testInts.<span style="color: #000000;">map</span><span style="color: #F78811;">&#40;</span>a2.<span style="color: #000000;">f</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic;">// sequenceOption</span>
    assertEquals<span style="color: #F78811;">&#40;</span>sequenceOption<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span>Some<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">7</span><span style="color: #F78811;">&#41;</span>,
        Some<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">8</span><span style="color: #F78811;">&#41;</span>, Some<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">9</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>, Some<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">7</span>, <span style="color: #F78811;">8</span>, <span style="color: #F78811;">9</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
    assertEquals<span style="color: #F78811;">&#40;</span>sequenceOption<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span>Some<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">7</span><span style="color: #F78811;">&#41;</span>, None, Some<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">9</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>,
        None<span style="color: #F78811;">&#41;</span>
    assertEquals<span style="color: #F78811;">&#40;</span>sequenceOption<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>,
      Some<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
    <span style="color: #008000; font-style: italic;">// sequenceInter</span>
    assertInterEquals<span style="color: #F78811;">&#40;</span>sequenceInter<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>,
      Inter<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span> <span style="color: #000080;">=&gt;</span> List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
    assertInterEquals<span style="color: #F78811;">&#40;</span>sequenceInter<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span>Inter<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">1</span>+<span style="color: #F78811;">&#41;</span>,
        Inter<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">2</span><span style="color: #000080;">*</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>, Inter<span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">=&gt;</span> List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">1</span>+n, <span style="color: #F78811;">2</span><span style="color: #000080;">*</span>n<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>    
  <span style="color: #F78811;">&#125;</span> 
<span style="color: #F78811;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/understanding-monads-using-scala-part-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Optional a -&gt; a (negative proof)</title>
		<link>http://blog.tmorris.net/optional-a-negative-proof/</link>
		<comments>http://blog.tmorris.net/optional-a-negative-proof/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 03:57:14 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=779</guid>
		<description><![CDATA[A loose follow-on from Java Trivia.
I run a weekly Haskell session at my place of employment. We are just beginning. The intention is not so much to learn Haskell, but to learn deeper programming concepts so that we can apply them regardless of language &#8212; though to the extent that various languages permit.
Recently, we were [...]]]></description>
			<content:encoded><![CDATA[<p><em>A loose follow-on from <a href="http://blog.tmorris.net/java-trivia/" >Java Trivia</a>.</em></p>
<p>I run a weekly Haskell session at my place of employment. We are just beginning. The intention is not so much to learn Haskell, but to learn deeper programming concepts so that we can apply them regardless of language &#8212; though to the extent that various languages permit.</p>
<p>Recently, we were discussing algebraic data types and we invented our own:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell"><span style="color: #06c; font-weight: bold;">data</span> Optional a <span style="color: #339933; font-weight: bold;">=</span> Full a <span style="color: #339933; font-weight: bold;">|</span> Empty <span style="color: #06c; font-weight: bold;">deriving</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Eq</span><span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">Show</span><span style="color: green;">&#41;</span></pre></div></div>

<p>This is equivalent to:</p>
<ul>
<li><a href="http://functionaljava.googlecode.com/svn/artifacts/2.23/javadoc/fj/data/Option.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/functionaljava.googlecode.com');">fj.data.Option</a> for Java</li>
<li><a href="http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.haskell.org');">Data.Maybe</a> for Haskell</li>
<li><a href="http://www.scala-lang.org/docu/files/api/scala/Option.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.scala-lang.org');">scala.Option</a> for Scala</li>
<li><a href="http://msdn.microsoft.com/en-us/library/dd233245.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/msdn.microsoft.com');">option</a> for F#</li>
<li><a href="http://ocaml-lib.sourceforge.net/doc/Option.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/ocaml-lib.sourceforge.net');">module Option</a> for OCaml</li>
<li><a href="http://www.standardml.org/Basis/option.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.standardml.org');">Option</a> for SML</li>
<li><a href="http://www.lix.polytechnique.fr/coq/stdlib/Coq.Init.Datatypes.html#option" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.lix.polytechnique.fr');">option</a> for Coq</li>
</ul>
<p>We were writing a function with this type</p>

<div class="wp_syntax"><div class="code"><pre class="haskell">Optional a <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; a <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; a</pre></div></div>

<p>when a member of the audience said, &#8220;Why not just use <code>Optional a -&gt; a</code>?&#8221; to which I responded, &#8220;That&#8217;s not possible to do in a consistent way.&#8221; That is, not only we shouldn&#8217;t, but we cannot do it, no matter what! By consistent here, I mean a total, terminating function. Telling programmers that something is not possible is often a little hasty, even if it is true, so I side-stepped any further discussion on this matter and carried on, promising further explanation, which follows.</p>
<p>Here I will prove it is not possible by exploiting the Curry-Howard Isomorphism. It is not intended to be deep or technical, only to display some of the possibilities of using &#8220;types as propositions, programs as proof&#8221; &#8212; to paraphrase the intention of C-H Isomorphism.</p>
<p>The essence of C-H is quite simple. If you write a type signature, you have also written a logical proposition. If you find at least one function that satisfies this signature, you have proven that proposition. Conversely, if you have a program, its existence proves its type (whether the programming language explicitly supplies that type or not). This program for a type is called an <em>inhabitant</em> of the type. Some types are uninhabited, for example: <code>a -&gt; b</code>. That&#8217;s because this proposition is not true.</p>
<p>To state it logically, <code>forall a b. a implies b</code> is a false statement. You can determine this by a simple truth table:</p>
<pre>a b a-&gt;b
0 0 1
0 1 1
1 0 0 &lt;-- inconsistency
1 1 1</pre>
<p>In <a href="http://blog.tmorris.net/java-trivia/" >a previous post</a>, I demonstrated a function that was <em>once-inhabited</em> using (a subset of &#8212; <em>see the rules</em>) Java. I knew it was once-inhabited before I gave the puzzle, meaning that every answer given should be the same (extensionally equivalent). Once-inhabited functions are very interesting, but not here &#8212; since we are looking for either:</p>
<ul>
<li>At least one inhabitant (proof which I have claimed does not exist)</li>
<li>The absence of an inhabitant (proof negative)</li>
</ul>
<p>So how can we prove or disprove <code>Optional a -&gt; a</code>?</p>
<p>My claim is that it is uninhabited. You can disprove this claim by finding an inhabitant. However, the inability to find an inhabitant does not disprove the proposition &#8212; after all, we might just be having an unimaginative day! I am assuring you for now, that you will find no such inhabitant. Now I will prove that you won&#8217;t.</p>
<p>We first ask the question, what exactly is <code>Optional a</code>? We can provide a data structure of equivalence by exploiting the <a href="http://en.wikipedia.org/wiki/Catamorphism" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');">catamorphism</a> for the data type:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell"><span style="color: #06c; font-weight: bold;">type</span> Optional a <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">forall</span> x<span style="color: #339933; font-weight: bold;">.</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x</pre></div></div>

<p>This data type is isomorphic (of the same one form) to our previous one and you can determine this by passing in the two constructors of the earlier data type to this isomorphic data type to produce an identity function:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell"><span style="color: #06c; font-weight: bold;">let</span> cata <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x
cata Full Empty <span style="color: #339933; font-weight: bold;">==</span> <span style="font-weight: bold;">id</span></pre></div></div>

<p>Side note: if you&#8217;re interested in doing the same for a Haskell list, see the <code>foldr</code> function denoting the list catamorphism (<code>foldr (:) [] == id</code>).</p>
<p>Therefore, our proposition to prove/disprove is now rewritten <em>(remember that <code>-&gt;</code> is right-associative)</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell"><span style="color: #06c; font-weight: bold;">forall</span> a x<span style="color: #339933; font-weight: bold;">.</span> <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-</span>&amp;gt; a<span style="color: green;">&#41;</span></pre></div></div>

<p>Using this, and the truth table for logical implication, we can find an answer by another truth table. Let us first assign some of the parts of this proposition to values for brevity (s being the proposition under investigation):</p>
<pre>p = a -&gt; x
q = x -&gt; x
r = p -&gt; q
s = r -&gt; a</pre>
<p>Let us now draw the truth table:</p>
<pre>a x p q r s
0 0 1 1 1 0 &lt;-- inconsistency
0 1 1 1 1 0 &lt;-- inconsistency
1 0 0 1 1 1
1 1 1 1 1 1</pre>
<p>We have now disproven the proposition <code>Optional a -&gt; a</code>. It is not possible to inhabit this type signature consistently.</p>
<p>Further Reading:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Curry%E2%80%93Howard_correspondence" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');">The Curry-Howard Correspondence</a></li>
<li><a href="http://en.wikibooks.org/wiki/Haskell/The_Curry-Howard_isomorphism" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikibooks.org');">The Curry-Howard Isomorphism with a crash course in formal logic</a></li>
</ul>
<p>As always, I hope this helps!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/optional-a-negative-proof/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Trivia</title>
		<link>http://blog.tmorris.net/java-trivia/</link>
		<comments>http://blog.tmorris.net/java-trivia/#comments</comments>
		<pubDate>Mon, 31 May 2010 10:19:54 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=771</guid>
		<description><![CDATA[Implement the missing function body. These rules must be followed:

No using null
No throwing an exception/error
Function must terminate
No side-effecting
No type-casing (instanceof)
No type-casting

How many different ways of achieving the objective?

interface Function&#60;A, B&#62; &#123;
  B apply&#40;A a&#41;;
&#125;
&#160;
class C &#123;
  static &#60;A, B, C&#62; Function&#60;A, C&#62; c&#40;final Function&#60;A, B&#62; f,
        [...]]]></description>
			<content:encoded><![CDATA[<p>Implement the missing function body. These rules must be followed:</p>
<ul>
<li>No using <code>null</code></li>
<li>No throwing an exception/error</li>
<li>Function must terminate</li>
<li>No side-effecting</li>
<li>No type-casing (<code>instanceof</code>)</li>
<li>No type-casting</li>
</ul>
<p>How many different ways of achieving the objective?</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span style="color: #000000; font-weight: bold;">interface</span> Function<span style="color: #339933;">&lt;</span>A, B<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
  B apply<span style="color: #009900;">&#40;</span>A a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> C <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>A, B, C<span style="color: #339933;">&gt;</span> Function<span style="color: #339933;">&lt;</span>A, C<span style="color: #339933;">&gt;</span> c<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Function<span style="color: #339933;">&lt;</span>A, B<span style="color: #339933;">&gt;</span> f,
                                    <span style="color: #000000; font-weight: bold;">final</span> Function<span style="color: #339933;">&lt;</span>B, C<span style="color: #339933;">&gt;</span> g<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      .... <span style="color: #006633;">todo</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/java-trivia/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Beginner Java Exercise with Data Types</title>
		<link>http://blog.tmorris.net/beginner-java-exercise-with-data-types/</link>
		<comments>http://blog.tmorris.net/beginner-java-exercise-with-data-types/#comments</comments>
		<pubDate>Wed, 12 May 2010 01:27:14 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=760</guid>
		<description><![CDATA[Below is a data type that represents a list that has a maximum length of one. It is often useful in cases where null would otherwise be used.
Consider for example, the getHeaders method on HttpServletRequest which returns a String but might return null if there is no such header. Instead, a new API might return [...]]]></description>
			<content:encoded><![CDATA[<p>Below is a data type that represents a list that has a maximum length of one. It is often useful in cases where <code>null</code> would otherwise be used.</p>
<p>Consider for example, <a href="http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletRequest.html#getHeader%28java.lang.String%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');">the <code>getHeaders</code> method</a> on <code>HttpServletRequest</code> which returns a <code>String</code> but might return <code>null</code> if there is no such header. Instead, a new API might return <code>NoneOrOne&lt;String></code> and do away with the use of <code>null</code>.</p>
<p>The idea of this exercise is to fill out the method bodies (remove the thrown <code>Error</code>) according to the comments without altering the method type. It is not permitted to use <code>null</code> or throw any exception. The tests at the bottom (see <code>main</code> method) should produce the specified results. At the moment, the code compiles, but will not execute successfully.</p>
<p>There are nine methods that need filling out. The tests are not exhaustive (use some intuition). Have fun! Questions are welcome.</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span style="color: #666666; font-style: italic;">// A list that is either empty or has one element.</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> NoneOrOne<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// The key abstract method (catamorphism).</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #339933;">&lt;</span>X<span style="color: #339933;">&gt;</span> X fold<span style="color: #009900;">&#40;</span>Thunk<span style="color: #339933;">&lt;</span>X<span style="color: #339933;">&gt;</span> none, Func<span style="color: #339933;">&lt;</span>A, X<span style="color: #339933;">&gt;</span> one<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Produces an empty list.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> NoneOrOne<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> none<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Produces a list with the given element.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> NoneOrOne<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> one<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> A a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Returns true if this list is empty.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> isEmpty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Maps the given function on each element of this list.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;</span> NoneOrOne<span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;</span> map<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Func<span style="color: #339933;">&lt;</span>A, B<span style="color: #339933;">&gt;</span> f<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Filters the list on the given predicate.</span>
  <span style="color: #666666; font-style: italic;">// The element is retained if the predicate satisfies.</span>
  <span style="color: #000000; font-weight: bold;">public</span> NoneOrOne<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> filter<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Func<span style="color: #339933;">&lt;</span>A, Boolean<span style="color: #339933;">&gt;</span> p<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Applies the possible function on this list.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;</span> NoneOrOne<span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;</span> app<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>Func<span style="color: #339933;">&lt;</span>A, B<span style="color: #339933;">&gt;&gt;</span> f<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Binds the given function on this list.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;</span> NoneOrOne<span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;</span> bind<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Func<span style="color: #339933;">&lt;</span>A, NoneOrOne<span style="color: #339933;">&lt;</span>B<span style="color: #339933;">&gt;&gt;</span> f<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Returns the value held in this list.</span>
  <span style="color: #666666; font-style: italic;">// However, if it is empty, return the given default value.</span>
  <span style="color: #000000; font-weight: bold;">public</span> A get<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Thunk<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> def<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// If this list is empty, return the given one.</span>
  <span style="color: #666666; font-style: italic;">// Otherwise, return this list.</span>
  <span style="color: #000000; font-weight: bold;">public</span> NoneOrOne<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> orElse<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>A<span style="color: #339933;">&gt;</span> els<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// For debugging</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">final</span> StringBuilder s <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    s.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'['</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fold<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Thunk<span style="color: #339933;">&lt;</span>Object<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> value<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Java has no suitable unit type.</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>, <span style="color: #000000; font-weight: bold;">new</span> Func<span style="color: #339933;">&lt;</span>A, Object<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> apply<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> A a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        s.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Java has no suitable unit type.</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> s.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">']'</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// TEST</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span> s <span style="color: #339933;">=</span> NoneOrOne.<span style="color: #006633;">one</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> t <span style="color: #339933;">=</span> s.<span style="color: #006633;">map</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Func<span style="color: #339933;">&lt;</span>Integer, String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> apply<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Integer</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">*</span> <span style="color: #cc66cc;">123</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">reverse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span> u <span style="color: #339933;">=</span> s.<span style="color: #006633;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Func<span style="color: #339933;">&lt;</span>Integer, Boolean<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Boolean</span> apply<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Integer</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> i <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> v <span style="color: #339933;">=</span> s.<span style="color: #006633;">app</span><span style="color: #009900;">&#40;</span>NoneOrOne.<span style="color: #339933;">&lt;</span>Func<span style="color: #339933;">&lt;</span>Integer, String<span style="color: #339933;">&gt;&gt;</span>one<span style="color: #009900;">&#40;</span>
      <span style="color: #000000; font-weight: bold;">new</span> Func<span style="color: #339933;">&lt;</span>Integer, String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> apply<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Integer</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">String</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Math</span>.<span style="color: #006633;">pow</span><span style="color: #009900;">&#40;</span>i, i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> w <span style="color: #339933;">=</span> s.<span style="color: #006633;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Func<span style="color: #339933;">&lt;</span>Integer, NoneOrOne<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> NoneOrOne<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> apply<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Integer</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> i <span style="color: #339933;">%</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">?</span>
          one<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;it's even&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>
          i <span style="color: #339933;">%</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">?</span>
            one<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;it's divisible by 3 but not 6&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>
            NoneOrOne.<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span>none<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Integer</span> x <span style="color: #339933;">=</span> s.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Thunk<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Integer</span> value<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">42</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">final</span> NoneOrOne<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span> y <span style="color: #339933;">=</span> NoneOrOne.<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span>none<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">orElse</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/*
    $ java NoneOrOne 122
    [122]
    [60051]
    []
    [3.4347832971354663E254]
    [it's even]
    122
    [122]
&nbsp;
    $ java -classpath /tmp/ NoneOrOne 12
    [12]
    [6741]
    [12]
    [8.916100448256E12]
    [it's even]
    12
    [12]
    */</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>u<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>v<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>w<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Laziness</span>
<span style="color: #000000; font-weight: bold;">interface</span> Thunk<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
  T value<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Takes an A and produces a B</span>
<span style="color: #000000; font-weight: bold;">interface</span> Func<span style="color: #339933;">&lt;</span>A, B<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
  B apply<span style="color: #009900;">&#40;</span>A a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/beginner-java-exercise-with-data-types/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Haskell Beginner Exercises with Tests</title>
		<link>http://blog.tmorris.net/haskell-beginner-exercises-with-tests/</link>
		<comments>http://blog.tmorris.net/haskell-beginner-exercises-with-tests/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 23:53:01 +0000</pubDate>
		<dc:creator>Tony Morris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.tmorris.net/?p=757</guid>
		<description><![CDATA[Follow-on from Haskell Exercises for Beginners

-- TOTAL marks:    /66
&#160;
module Exercises where
&#160;
import Prelude hiding &#40;sum, length, map, filter, maximum, reverse, succ, pred&#41;
&#160;
-- BEGIN Helper functions and data types
&#160;
-- The custom list type
data List t = Nil &#124; Cons t &#40;List t&#41; deriving Eq
&#160;
instance &#40;Show t&#41; =&#62; Show &#40;List t&#41; where
  show = [...]]]></description>
			<content:encoded><![CDATA[<p>Follow-on from <a href="http://blog.tmorris.net/haskell-exercises-for-beginners/" >Haskell Exercises for Beginners</a></p>

<div class="wp_syntax"><div class="code"><pre class="haskell"><span style="color: #5d478b; font-style: italic;">-- TOTAL marks:    /66</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">module</span> Exercises <span style="color: #06c; font-weight: bold;">where</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">import</span> <span style="color: #06c; font-weight: bold;">Prelude</span> <span style="color: #06c; font-weight: bold;">hiding</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">sum</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">length</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">map</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">filter</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">maximum</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">reverse</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">succ</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">pred</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- BEGIN Helper functions and data types</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- The custom list type</span>
<span style="color: #06c; font-weight: bold;">data</span> List t <span style="color: #339933; font-weight: bold;">=</span> Nil <span style="color: #339933; font-weight: bold;">|</span> Cons t <span style="color: green;">&#40;</span>List t<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">deriving</span> <span style="color: #cccc00; font-weight: bold;">Eq</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">instance</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Show</span> t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> <span style="color: #cccc00; font-weight: bold;">Show</span> <span style="color: green;">&#40;</span>List t<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">where</span>
  <span style="font-weight: bold;">show</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">show</span> <span style="color: #339933; font-weight: bold;">.</span> toList
    <span style="color: #06c; font-weight: bold;">where</span>
    toList Nil <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span>
    toList <span style="color: green;">&#40;</span>Cons h t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> h : toList t
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- the custom numeric type</span>
<span style="color: #06c; font-weight: bold;">data</span> Natural <span style="color: #339933; font-weight: bold;">=</span> Zero <span style="color: #339933; font-weight: bold;">|</span> Succ Natural <span style="color: #06c; font-weight: bold;">deriving</span> <span style="color: #cccc00; font-weight: bold;">Eq</span>
one <span style="color: #339933; font-weight: bold;">=</span> Succ Zero
two <span style="color: #339933; font-weight: bold;">=</span> Succ one
three <span style="color: #339933; font-weight: bold;">=</span> Succ two
&nbsp;
<span style="color: #06c; font-weight: bold;">instance</span> <span style="color: #cccc00; font-weight: bold;">Show</span> Natural <span style="color: #06c; font-weight: bold;">where</span>
  <span style="font-weight: bold;">show</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">show</span> <span style="color: #339933; font-weight: bold;">.</span> toInt
    <span style="color: #06c; font-weight: bold;">where</span>
    toInt Zero <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">0</span>
    toInt <span style="color: green;">&#40;</span>Succ x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">1</span> <span style="color: #339933; font-weight: bold;">+</span> toInt x
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- functions over Natural that you may consider using</span>
<span style="font-weight: bold;">succ</span> <span style="color: #339933; font-weight: bold;">::</span> Natural <span style="color: #339933; font-weight: bold;">-&gt;</span> Natural
<span style="font-weight: bold;">succ</span> <span style="color: #339933; font-weight: bold;">=</span> Succ
&nbsp;
<span style="font-weight: bold;">pred</span> <span style="color: #339933; font-weight: bold;">::</span> Natural <span style="color: #339933; font-weight: bold;">-&gt;</span> Natural
<span style="font-weight: bold;">pred</span> Zero <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;bzzt. Zero has no predecessor in naturals&quot;</span>
<span style="font-weight: bold;">pred</span> <span style="color: green;">&#40;</span>Succ x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> x
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- functions over List that you may consider using</span>
foldRight <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> b
foldRight <span style="color: #339933; font-weight: bold;">_</span> b Nil <span style="color: #339933; font-weight: bold;">=</span> b
foldRight f b <span style="color: green;">&#40;</span>Cons h t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> f h <span style="color: green;">&#40;</span>foldRight f b t<span style="color: green;">&#41;</span>
&nbsp;
foldLeft <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>b <span style="color: #339933; font-weight: bold;">-&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> b
foldLeft <span style="color: #339933; font-weight: bold;">_</span> b Nil <span style="color: #339933; font-weight: bold;">=</span> b
foldLeft f b <span style="color: green;">&#40;</span>Cons h t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">let</span> b' <span style="color: #339933; font-weight: bold;">=</span> f b h <span style="color: #06c; font-weight: bold;">in</span> b' `<span style="font-weight: bold;">seq</span>` foldLeft f b' t
&nbsp;
reduceRight <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> a
reduceRight <span style="color: #339933; font-weight: bold;">_</span> Nil <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;bzzt. reduceRight on empty list&quot;</span>
reduceRight f <span style="color: green;">&#40;</span>Cons h t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> foldRight f h t
&nbsp;
reduceLeft <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> a
reduceLeft <span style="color: #339933; font-weight: bold;">_</span> Nil <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;bzzt. reduceLeft on empty list&quot;</span>
reduceLeft f <span style="color: green;">&#40;</span>Cons h t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> foldLeft f h t
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- END Helper functions and data types</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- BEGIN Exercises</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 1</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 1</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 2.0 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 0.5 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 0.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 3</span>
add <span style="color: #339933; font-weight: bold;">::</span> Natural <span style="color: #339933; font-weight: bold;">-&gt;</span> Natural <span style="color: #339933; font-weight: bold;">-&gt;</span> Natural
add <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 2</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 2</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 2.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 0.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 4</span>
<span style="font-weight: bold;">sum</span> <span style="color: #339933; font-weight: bold;">::</span> List <span style="color: #cccc00; font-weight: bold;">Int</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Int</span>
<span style="font-weight: bold;">sum</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 3</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 2</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 2.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 0.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 4</span>
<span style="font-weight: bold;">length</span> <span style="color: #339933; font-weight: bold;">::</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Int</span>
<span style="font-weight: bold;">length</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 4</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 5</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 4.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1.0 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 1.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 7</span>
<span style="font-weight: bold;">map</span> <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> List b
<span style="font-weight: bold;">map</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 5</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 5</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 4.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 1 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 7</span>
<span style="font-weight: bold;">filter</span> <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Bool</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> List a
<span style="font-weight: bold;">filter</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 6</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 5</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 4.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 1 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 7</span>
append <span style="color: #339933; font-weight: bold;">::</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> List a
append <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 7</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 5</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 4.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 1 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 7</span>
flatten <span style="color: #339933; font-weight: bold;">::</span> List <span style="color: green;">&#40;</span>List a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> List a
flatten <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 8</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 7</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 5.0 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 1.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 1.5 mark</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 8</span>
flatMap <span style="color: #339933; font-weight: bold;">::</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> List b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> List b
flatMap <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 9</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 8</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 3.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 3.0 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 2.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 9</span>
<span style="font-weight: bold;">maximum</span> <span style="color: #339933; font-weight: bold;">::</span> List <span style="color: #cccc00; font-weight: bold;">Int</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Int</span>
<span style="font-weight: bold;">maximum</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exercise 10</span>
<span style="color: #5d478b; font-style: italic;">-- Relative Difficulty: 10</span>
<span style="color: #5d478b; font-style: italic;">-- Correctness: 5.0 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Performance: 2.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Elegance: 2.5 marks</span>
<span style="color: #5d478b; font-style: italic;">-- Total: 10</span>
<span style="font-weight: bold;">reverse</span> <span style="color: #339933; font-weight: bold;">::</span> List a <span style="color: #339933; font-weight: bold;">-&gt;</span> List a
<span style="font-weight: bold;">reverse</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;todo&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- END Exercises</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- BEGIN Tests for Exercises</span>
&nbsp;
main <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">IO</span> <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>
main <span style="color: #339933; font-weight: bold;">=</span>
  <span style="color: #06c; font-weight: bold;">let</span> showNil <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Nil <span style="color: #339933; font-weight: bold;">::</span> List <span style="color: #cccc00; font-weight: bold;">Int</span><span style="color: green;">&#41;</span>
      results <span style="color: #339933; font-weight: bold;">=</span>
        <span style="color: green;">&#91;</span>
        <span style="color: #5d478b; font-style: italic;">-- add</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;add&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>add one two<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> three<span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;add&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>add Zero two<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> two<span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- sum</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;sum&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">sum</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: red;">6</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;sum&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">sum</span> Nil<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: red;">0</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- length</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;length&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">length</span> <span style="color: green;">&#40;</span>Cons 'a' <span style="color: green;">&#40;</span>Cons 'b' <span style="color: green;">&#40;</span>Cons 'c' Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: red;">3</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;length&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">length</span> Nil<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: red;">0</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- map</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;map&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">map</span> <span style="color: green;">&#40;</span><span style="color: red;">+1</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;map&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">map</span> <span style="color: green;">&#40;</span><span style="color: red;">+1</span><span style="color: green;">&#41;</span> Nil<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> showNil<span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- filter</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;filter&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">filter</span> <span style="font-weight: bold;">even</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;filter&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">filter</span> <span style="font-weight: bold;">even</span> Nil<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> showNil<span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- append</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;append&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>append <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;append&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>append <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> Nil<span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- flatten</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;flatten&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>flatten <span style="color: green;">&#40;</span>Cons <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span>Cons <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- flatMap</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;flatMap&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>flatMap <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span>\n <span style="color: #339933; font-weight: bold;">-&gt;</span> Cons <span style="color: green;">&#40;</span>n<span style="color: red;">+1</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span>Cons <span style="color: green;">&#40;</span>n<span style="color: red;">+2</span><span style="color: green;">&#41;</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">4</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">5</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- maximum</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;maximum&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">maximum</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: red;">3</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span>
&nbsp;
        <span style="color: #5d478b; font-style: italic;">-- reverse</span>
        <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;reverse&quot;</span><span style="color: #339933; font-weight: bold;">,</span>
         <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">reverse</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
       <span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">show</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">3</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">2</span> <span style="color: green;">&#40;</span>Cons <span style="color: red;">1</span> Nil<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
        <span style="color: green;">&#93;</span>
      check <span style="color: green;">&#40;</span>n<span style="color: #339933; font-weight: bold;">,</span> a<span style="color: #339933; font-weight: bold;">,</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> <span style="font-weight: bold;">print</span> <span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;=== &quot;</span> <span style="color: #339933; font-weight: bold;">++</span> n <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot; ===&quot;</span><span style="color: green;">&#41;</span>
                           <span style="font-weight: bold;">print</span> <span style="color: green;">&#40;</span><span style="color: #06c; font-weight: bold;">if</span> a <span style="color: #339933; font-weight: bold;">==</span> b <span style="color: #06c; font-weight: bold;">then</span> <span style="background-color: #3cb371;">&quot;PASS&quot;</span> <span style="color: #06c; font-weight: bold;">else</span> <span style="background-color: #3cb371;">&quot;FAIL Expected: &quot;</span> <span style="color: #339933; font-weight: bold;">++</span> b <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot; Actual: &quot;</span> <span style="color: #339933; font-weight: bold;">++</span> a<span style="color: green;">&#41;</span>
&nbsp;
  <span style="color: #06c; font-weight: bold;">in</span> <span style="font-weight: bold;">mapM_</span> check results
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- END Tests for Exercises</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.tmorris.net/haskell-beginner-exercises-with-tests/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
