<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
<head>
<title>Type Classes</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<link rel="shortcut icon" href="icon.ico" />
<script src="common_en.js" charset="utf-8" type="text/javascript"></script> 
<link rel="stylesheet" href="common.css" type="text/css" />
</head>
<body onload="javascript:resetForms(); javascript:slidy_init();">
<div><h1 class="cover">Type Classes</h1>
<div id="info"></div>
<ul>
<li><a href="#overloading-functions">Overloading Functions</a></li>
<li><a href="#type-class-definition">Type Class Definition</a><ul>
<li><a href="#exercise">Exercise</a></li>
<li><a href="#exercise-1">Exercise</a></li>
</ul></li>
<li><a href="#type-instance-definition">Type Instance Definition</a><ul>
<li><a href="#exercise-2">Exercise</a></li>
<li><a href="#exercise-3">Exercise</a></li>
<li><a href="#exercise-4">Exercise</a></li>
<li><a href="#exercise-5">Exercise</a></li>
<li><a href="#exercise-6">Exercise</a></li>
</ul></li>
<li><a href="#default-methods">Default Methods</a></li>
<li><a href="#subclasses">Subclasses</a></li>
<li><a href="#deriving-instances">Deriving Instances</a></li>
<li><a href="#ambiguous-overloading">Ambiguous Overloading</a></li>
<li><a href="#laws">Laws</a></li>
<li><a href="#the-num-type-class">The <code>Num</code> Type Class</a><ul>
<li><a href="#exercise-7">Exercise</a></li>
</ul></li>
<li><a href="#overlapping-instances">Overlapping Instances</a></li>
</ul>
</div>
<section id="overloading-functions" class="level1">
<h1>Overloading Functions</h1>
<p>Defined functions should have different names within the same scope and name space. So sometimes it is convenient to <em>overload</em> certain functions in order to use <em>identical</em> names for <em>different</em> function (over <em>different</em> types).</p>
<p>A naive implementation by records (“dictionaries”):</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Equals</span> a <span class="fu">=</span> <span class="dt">Equals</span></a>
<a class="sourceLine" id="cb1-2" data-line-number="2">  {<span class="ot"> equals    ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb1-3" data-line-number="3">  ,<span class="ot"> notEquals ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb1-4" data-line-number="4">  }</a></code></pre></div>
<p>where there is a separate dictionary defined for <code>Bool</code>:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb2-1" data-line-number="1">eqBool <span class="fu">=</span> <span class="dt">Equals</span> { equals <span class="fu">=</span> boolEquals, notEquals <span class="fu">=</span> boolNotEquals }</a>
<a class="sourceLine" id="cb2-2" data-line-number="2">  <span class="kw">where</span></a>
<a class="sourceLine" id="cb2-3" data-line-number="3">    boolEquals <span class="dt">True</span>  <span class="dt">True</span>  <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb2-4" data-line-number="4">    boolEquals <span class="dt">False</span> <span class="dt">False</span> <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb2-5" data-line-number="5">    boolEquals _     _     <span class="fu">=</span> <span class="dt">False</span></a>
<a class="sourceLine" id="cb2-6" data-line-number="6"></a>
<a class="sourceLine" id="cb2-7" data-line-number="7">    boolNotEquals x y <span class="fu">=</span> not (boolEquals x y)</a></code></pre></div>
<p>as well as for <code>Int</code>:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb3-1" data-line-number="1">eqInt <span class="fu">=</span> <span class="dt">Equals</span> { equals <span class="fu">=</span> (<span class="fu">==</span>), notEquals <span class="fu">=</span> (<span class="fu">/=</span>) }<span class="ot"> ::</span> <span class="dt">Equals</span> <span class="dt">Int</span></a></code></pre></div>
<p>The dictionaries could be then used in function definitions as follows.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="ot">compareList ::</span> <span class="dt">Equals</span> a <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb4-2" data-line-number="2">compareList _  []     []     <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb4-3" data-line-number="3">compareList eq (x<span class="fu">:</span>xs) (y<span class="fu">:</span>ys) <span class="fu">=</span> (equals eq) x y <span class="fu">&amp;&amp;</span> compareList eq xs ys</a>
<a class="sourceLine" id="cb4-4" data-line-number="4">compareList _  _      _      <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<p>And those functions are invoked like that.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','add2b05372d31b92e5ff596504d21dd0','add2b05372d31b92e5ff596504d21dd0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaadd2b05372d31b92e5ff596504d21dd0" value="compareList eqBool [True,True,False,False] [True,False,True,False]" /><br /><div class="answer" id="resadd2b05372d31b92e5ff596504d21dd0"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','f4953cd46152fd99f7d2a23d4ac60de8','f4953cd46152fd99f7d2a23d4ac60de8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf4953cd46152fd99f7d2a23d4ac60de8" value="compareList eqInt  [1..10] [10,9..1]" /><br /><div class="answer" id="resf4953cd46152fd99f7d2a23d4ac60de8"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="type-class-definition" class="level1">
<h1>Type Class Definition</h1>
<p>Type classes are set of overloaded functions, called members or methods. Type classes have variables that indicate how the different instantiations vary.</p>
<p>Example:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">class</span> <span class="dt">Eq</span> a <span class="kw">where</span></a>
<a class="sourceLine" id="cb5-2" data-line-number="2"><span class="ot">     (==) ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<ul>
<li><code>Eq</code> is the <em>type class constructor</em></li>
<li><code>a</code> is a <em>type class variable</em></li>
<li><code>(==)</code> is a <em>method</em></li>
</ul>
<p>Type of the method:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','e450e4a9abe00107ff30eb6a140c1cae','e450e4a9abe00107ff30eb6a140c1cae');"><div class="answer" id="rese450e4a9abe00107ff30eb6a140c1cae"><code class="result">(==)</code><code> :: </code><code class="type">Eq a =&gt; a -&gt; a -&gt; Bool</code></div></form>
<p>Note that the <code>a</code> type variable. There is an additional restriction, called a class context, imposed. Class context is a form of bounded (parametric) polymorphism. Such contexts can be inferred automatically.</p>
<section id="exercise" class="level2">
<h2>Exercise</h2>
<p>Define a type class for default values. The purpose of this class to provide a default value for the member types when needed. It shall be called <code>Default</code> and it shall have a method called <code>defaultValue</code>:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','54660017872feda3bec177c602ccc7c5','54660017872feda3bec177c602ccc7c5');"><div class="answer" id="res54660017872feda3bec177c602ccc7c5"><code class="result">defaultValue</code><code> :: </code><code class="type">Default a =&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','02d2817996e6ee5830cdf59d5492a275','02d2817996e6ee5830cdf59d5492a275');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea02d2817996e6ee5830cdf59d5492a275" value="defaultValue :: Bool" /><br /><div class="answer" id="res02d2817996e6ee5830cdf59d5492a275"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-1" class="level2">
<h2>Exercise</h2>
<p>Use the <code>Default</code> class to implement a linear search with a default value.</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="ot">findWithDefault ::</span> (<span class="dt">Eq</span> a, <span class="dt">Default</span> b) <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> [(a,b)] <span class="ot">-&gt;</span> b</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_TypeClasses_en_d233cfbea6de2764837255466666387b.hs','d233cfbea6de2764837255466666387b','d233cfbea6de2764837255466666387b');"><textarea cols="80" rows="3" id="taread233cfbea6de2764837255466666387b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resd233cfbea6de2764837255466666387b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','b1f27e76902a5c47ce2eaea4481b6c38','b1f27e76902a5c47ce2eaea4481b6c38');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab1f27e76902a5c47ce2eaea4481b6c38" value="findWithDefault &quot;foo&quot; [] :: Int" /><br /><div class="answer" id="resb1f27e76902a5c47ce2eaea4481b6c38"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','5d96b9c98b5b7315093c9c62bbee697f','5d96b9c98b5b7315093c9c62bbee697f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5d96b9c98b5b7315093c9c62bbee697f" value="findWithDefault &quot;foo&quot; [(&quot;bar&quot;, 42), (&quot;baz&quot;, 86), (&quot;foo&quot;, 101)] :: Int" /><br /><div class="answer" id="res5d96b9c98b5b7315093c9c62bbee697f"><code class="result">101</code><code> :: </code><code class="type">Int</code></div></form>
</section>
</section>
<section id="type-instance-definition" class="level1">
<h1>Type Instance Definition</h1>
<p>With an instance declaration an instance of a class can be defined.</p>
<p>Example:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Dir</span> <span class="fu">=</span> <span class="dt">L</span> <span class="fu">|</span> <span class="dt">R</span></a></code></pre></div>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">instance</span> <span class="dt">Eq</span> <span class="dt">Dir</span> <span class="kw">where</span></a>
<a class="sourceLine" id="cb8-2" data-line-number="2">     <span class="dt">L</span> <span class="fu">==</span> <span class="dt">L</span>   <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb8-3" data-line-number="3">     <span class="dt">R</span> <span class="fu">==</span> <span class="dt">R</span>   <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb8-4" data-line-number="4">     _ <span class="fu">==</span> _   <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<ul>
<li>Type classes are <em>open</em>, that is, they may have unlimited number of instances.</li>
<li>Instances can be added in any module where the class definition is available.</li>
<li>All methods have to be defined.</li>
</ul>
<section id="exercise-2" class="level2">
<h2>Exercise</h2>
<p>Define <code>Eq</code> instance on <code>P</code>.</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">data</span> <span class="dt">P</span> <span class="fu">=</span> <span class="dt">P</span> <span class="dt">Int</span> <span class="dt">Int</span></a></code></pre></div>
<p><em>Sorry, exercises of instance definitions are not possible here, use a text editor.</em></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','4bb2d7edadb7f485f090ae6fa8bb7e38','4bb2d7edadb7f485f090ae6fa8bb7e38');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4bb2d7edadb7f485f090ae6fa8bb7e38" value="P 1 2 == P 1 3" /><br /><div class="answer" id="res4bb2d7edadb7f485f090ae6fa8bb7e38"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-3" class="level2">
<h2>Exercise</h2>
<p>Define <code>Eq</code> instance on <code>Nat</code>.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Nat</span></a>
<a class="sourceLine" id="cb10-2" data-line-number="2">   <span class="fu">=</span> <span class="dt">Zero</span></a>
<a class="sourceLine" id="cb10-3" data-line-number="3">   <span class="fu">|</span> <span class="dt">Succ</span> <span class="dt">Nat</span></a></code></pre></div>
<p><em>Sorry, exercises of instance definitions are not possible here, use a text editor.</em></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','ca01806793cfc5a724b63da08af40b03','ca01806793cfc5a724b63da08af40b03');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaca01806793cfc5a724b63da08af40b03" value="Zero == Zero" /><br /><div class="answer" id="resca01806793cfc5a724b63da08af40b03"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','1d35801a0d498cd60b1337dbc270827f','1d35801a0d498cd60b1337dbc270827f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1d35801a0d498cd60b1337dbc270827f" value="Succ Zero /= Zero" /><br /><div class="answer" id="res1d35801a0d498cd60b1337dbc270827f"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-4" class="level2">
<h2>Exercise</h2>
<p>Define <code>Show</code> instance on <code>Nat</code>. See the test cases for the exact rules on the formatting.</p>
<p><em>Sorry, exercises of instance definitions are not possible here, use a text editor.</em></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','797876242fe7c55042dd116c2b59705c','797876242fe7c55042dd116c2b59705c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea797876242fe7c55042dd116c2b59705c" value="show Zero" /><br /><div class="answer" id="res797876242fe7c55042dd116c2b59705c"><code class="result">&quot;0&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','1f5d4cf648c99916fad816df84f582b8','1f5d4cf648c99916fad816df84f582b8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1f5d4cf648c99916fad816df84f582b8" value="show (Succ Zero)" /><br /><div class="answer" id="res1f5d4cf648c99916fad816df84f582b8"><code class="result">&quot;I&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','a6f6d3fa8f21a7703e9b7a9afcf8a643','a6f6d3fa8f21a7703e9b7a9afcf8a643');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa6f6d3fa8f21a7703e9b7a9afcf8a643" value="show (Succ (Succ (Succ (Succ (Succ Zero)))))" /><br /><div class="answer" id="resa6f6d3fa8f21a7703e9b7a9afcf8a643"><code class="result">&quot;IIIII&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-5" class="level2">
<h2>Exercise</h2>
<p>Define <code>Default</code> instances on the <code>Bool</code>, <code>Int</code>, and list types, with the default values of <code>False</code>, <code>0</code>, and <code>[]</code> respectively.</p>
<p><em>Sorry, exercises of instance definitions are not possible here, use a text editor.</em></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','f6ee6e7906eaec2bdb9119058dca2bfb','f6ee6e7906eaec2bdb9119058dca2bfb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf6ee6e7906eaec2bdb9119058dca2bfb" value="defaultValue :: Bool" /><br /><div class="answer" id="resf6ee6e7906eaec2bdb9119058dca2bfb"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','4be6160863e36cb764074c78ec5700f6','4be6160863e36cb764074c78ec5700f6');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4be6160863e36cb764074c78ec5700f6" value="defaultValue :: Int" /><br /><div class="answer" id="res4be6160863e36cb764074c78ec5700f6"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','4619aa80a0c704cf6bd5d17cf386339e','4619aa80a0c704cf6bd5d17cf386339e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4619aa80a0c704cf6bd5d17cf386339e" value="defaultValue :: [Char]" /><br /><div class="answer" id="res4619aa80a0c704cf6bd5d17cf386339e"><code class="result">[]</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
<section id="exercise-6" class="level2">
<h2>Exercise</h2>
<p>Define <code>Ord</code> instance on <code>Nat</code>.</p>
<p><em>Sorry, exercises of instance definitions are not possible here, use a text editor.</em></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','71fe74afce2847427def8c8210510733','71fe74afce2847427def8c8210510733');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea71fe74afce2847427def8c8210510733" value="(Succ Zero) `compare` (Succ Zero)" /><br /><div class="answer" id="res71fe74afce2847427def8c8210510733"><code class="result">EQ</code><code> :: </code><code class="type">Ordering</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','0ab6e75ccb017257069fbd2650e3e7d8','0ab6e75ccb017257069fbd2650e3e7d8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0ab6e75ccb017257069fbd2650e3e7d8" value="Zero `compare` (Succ (Succ (Succ Zero)))" /><br /><div class="answer" id="res0ab6e75ccb017257069fbd2650e3e7d8"><code class="result">LT</code><code> :: </code><code class="type">Ordering</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','b7dec28c8d46101e1963624639d86140','b7dec28c8d46101e1963624639d86140');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab7dec28c8d46101e1963624639d86140" value="(Succ (Succ (Succ (Succ Zero)))) `compare` (Succ (Succ Zero))" /><br /><div class="answer" id="resb7dec28c8d46101e1963624639d86140"><code class="result">GT</code><code> :: </code><code class="type">Ordering</code></div></form>
</section>
</section>
<section id="default-methods" class="level1">
<h1>Default Methods</h1>
<p>Instance definitions can also be defined in terms of other overloaded functions. In result, not every method has to be specified by the user when defining on a new instance.</p>
<p>Example:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">class</span> <span class="dt">Eq</span> a <span class="kw">where</span></a>
<a class="sourceLine" id="cb11-2" data-line-number="2"><span class="ot">     (==) ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb11-3" data-line-number="3">     a <span class="fu">==</span> b  <span class="fu">=</span>  not (a <span class="fu">/=</span> b)</a>
<a class="sourceLine" id="cb11-4" data-line-number="4"> </a>
<a class="sourceLine" id="cb11-5" data-line-number="5"><span class="ot">     (/=) ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb11-6" data-line-number="6">     a <span class="fu">/=</span> b  <span class="fu">=</span>  not (a <span class="fu">==</span> b)</a></code></pre></div>
</section>
<section id="subclasses" class="level1">
<h1>Subclasses</h1>
<p>A class definition can optionally refer to other, already defined, classes. Cyclic dependencies are forbidden, though. The classes to include are specified as context for the overloaded type variable.</p>
<p>It is not needed (but allowed) to define new methods.</p>
<p>Example:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">class</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> <span class="dt">Ord</span> a <span class="kw">where</span></a>
<a class="sourceLine" id="cb12-2" data-line-number="2">     (<span class="fu">&lt;</span>), (<span class="fu">&lt;=</span>), (<span class="fu">&gt;=</span>),<span class="ot"> (&gt;) ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb12-3" data-line-number="3">     </a>
<a class="sourceLine" id="cb12-4" data-line-number="4">     x <span class="fu">&lt;=</span> y   <span class="fu">=</span>  x <span class="fu">&lt;</span> y <span class="fu">||</span> x <span class="fu">==</span> y</a>
<a class="sourceLine" id="cb12-5" data-line-number="5">     x <span class="fu">&lt;</span>  y   <span class="fu">=</span>  not (x <span class="fu">&gt;=</span> y)</a>
<a class="sourceLine" id="cb12-6" data-line-number="6">     x <span class="fu">&gt;=</span> y   <span class="fu">=</span>  x <span class="fu">&gt;</span> y <span class="fu">||</span> x <span class="fu">==</span> y</a>
<a class="sourceLine" id="cb12-7" data-line-number="7">     x <span class="fu">&gt;</span>  y   <span class="fu">=</span>  not (x <span class="fu">&lt;=</span> y)</a></code></pre></div>
<p>Usage:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="ot">member ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">T</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb13-2" data-line-number="2">member a <span class="dt">E</span> <span class="fu">=</span> <span class="dt">False</span></a>
<a class="sourceLine" id="cb13-3" data-line-number="3">member a (<span class="dt">N</span> l b r)</a>
<a class="sourceLine" id="cb13-4" data-line-number="4">    <span class="fu">|</span> a <span class="fu">&lt;</span>  b  <span class="fu">=</span>  member a l</a>
<a class="sourceLine" id="cb13-5" data-line-number="5">    <span class="fu">|</span> a <span class="fu">==</span> b  <span class="fu">=</span>  <span class="dt">True</span>           </a>
<a class="sourceLine" id="cb13-6" data-line-number="6">    <span class="fu">|</span> a <span class="fu">&gt;</span>  b  <span class="fu">=</span>  member a r</a>
<a class="sourceLine" id="cb13-7" data-line-number="7"></a>
<a class="sourceLine" id="cb13-8" data-line-number="8"><span class="kw">data</span> <span class="dt">T</span> a <span class="fu">=</span> <span class="dt">E</span> <span class="fu">|</span> <span class="dt">N</span> (<span class="dt">T</span> a) a (<span class="dt">T</span> a) <span class="kw">deriving</span> (<span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Show</span>)</a></code></pre></div>
</section>
<section id="deriving-instances" class="level1">
<h1>Deriving Instances</h1>
<p>In Haskell, <code>data</code> and <code>newtype</code> declarations may contain an optional <code>deriving</code> clause to enable automatical generation of instances. When deriving a class for a tpye, instances for all superclasses must exist, either via an explicit declaration or using the <code>deriving</code> clause.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Maybe</span> a </a>
<a class="sourceLine" id="cb14-2" data-line-number="2">     <span class="fu">=</span> <span class="dt">Nothing</span> </a>
<a class="sourceLine" id="cb14-3" data-line-number="3">     <span class="fu">|</span> <span class="dt">Just</span> a</a>
<a class="sourceLine" id="cb14-4" data-line-number="4">         <span class="kw">deriving</span> (<span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Show</span>, <span class="dt">Read</span>)</a></code></pre></div>
<p>The only classes in the <code>Prelude</code> for which derived instances are allowed are <code>Eq</code>, <code>Ord</code>, <code>Enum</code>, <code>Bounded</code>, <code>Show</code>, and <code>Read</code>.</p>
<ul>
<li>deriving <code>Eq</code>: structural equality</li>
<li>deriving <code>Ord</code>: lexicographical ordering</li>
<li>deriving <code>Enum</code>: mapping to natural numbers</li>
<li>deriving <code>Show</code>: conversion to <code>String</code></li>
<li>deriving <code>Read</code>: parsing from <code>String</code></li>
</ul>
<p>When the <code>deriving</code> clause is omitted, no insance declarations are derived.</p>
</section>
<section id="ambiguous-overloading" class="level1">
<h1>Ambiguous Overloading</h1>
<p>Overloaded functions may be ambiguous sometimes. As an example for this, consider the <code>read</code> function.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','83d07e3f5dd233b0a8e5f1c2b4e03226','83d07e3f5dd233b0a8e5f1c2b4e03226');"><div class="answer" id="res83d07e3f5dd233b0a8e5f1c2b4e03226"><code class="result">read</code><code> :: </code><code class="type">Read a =&gt; String -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','489017765d06263a998b112cafb7ea05','489017765d06263a998b112cafb7ea05');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea489017765d06263a998b112cafb7ea05" value="read &quot;True&quot;" /><br /><div class="answer" id="res489017765d06263a998b112cafb7ea05"></div></form>
<pre><code>    No instance for (Read a0) arising from a use of `read&#39;
    The type variable `a0&#39; is ambiguous
    Possible fix: add a type signature that fixes these type variable(s)
    Note: there are several potential instances:
      instance Read () -- Defined in `GHC.Read&#39;
      instance (Read a, Read b) =&gt; Read (a, b) -- Defined in `GHC.Read&#39;
      instance (Read a, Read b, Read c) =&gt; Read (a, b, c)
        -- Defined in `GHC.Read&#39;
      ...plus 25 others
    In the expression: read &quot;True&quot;
    In an equation for `it&#39;: it = read &quot;True&quot;</code></pre>
<p>That is because it is not known what <code>a</code> is, so the corresponding implementation cannot be chosen.</p>
<p><em>(Note that the web site here will not display the error message above as it always tries to find some value for <code>a</code>. But it still finds the “wrong” type so the value cannot be eventually parsed.)</em></p>
<p>The ambiguity can be solved by giving an explicit type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','426ed116596912f389053e0cbc88049c','426ed116596912f389053e0cbc88049c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea426ed116596912f389053e0cbc88049c" value="read &quot;True&quot; :: Bool" /><br /><div class="answer" id="res426ed116596912f389053e0cbc88049c"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="laws" class="level1">
<h1>Laws</h1>
<ul>
<li><code>Eq</code> instances should be equivalence relations</li>
<li><code>Ord</code> instances should be orderings</li>
<li>∀a: <code>read (show</code> a<code>) ==</code> a</li>
<li>…</li>
</ul>
</section>
<section id="the-num-type-class" class="level1">
<h1>The <code>Num</code> Type Class</h1>
<div class="sourceCode" id="cb16"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="kw">class</span> (<span class="dt">Eq</span> a, <span class="dt">Show</span> a) <span class="ot">=&gt;</span> <span class="dt">Num</span> a <span class="kw">where</span></a>
<a class="sourceLine" id="cb16-2" data-line-number="2">    (<span class="fu">+</span>), (<span class="fu">-</span>),<span class="ot"> (*)    ::</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb16-3" data-line-number="3"><span class="ot">    negate           ::</span> a <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb16-4" data-line-number="4">    abs,<span class="ot"> signum      ::</span> a <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb16-5" data-line-number="5"><span class="ot">    fromInteger      ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb16-6" data-line-number="6"> </a>
<a class="sourceLine" id="cb16-7" data-line-number="7">    x <span class="fu">-</span> y            <span class="fu">=</span>  x <span class="fu">+</span> negate y</a>
<a class="sourceLine" id="cb16-8" data-line-number="8">    negate x         <span class="fu">=</span>  <span class="dv">0</span> <span class="fu">-</span> x</a></code></pre></div>
<section id="exercise-7" class="level2">
<h2>Exercise</h2>
<p>Define a <code>Num</code> instance on <code>Nat</code>.</p>
<p><em>Sorry, exercises of instance definitions are not possible here, use a text editor.</em></p>
</section>
</section>
<section id="overlapping-instances" class="level1">
<h1>Overlapping Instances</h1>
<p>A single type class instance is allowed for each type. However, an instance may cover multiple types at once. Consider the following type class:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="kw">class</span> <span class="dt">C</span> a <span class="kw">where</span></a>
<a class="sourceLine" id="cb17-2" data-line-number="2"><span class="ot">  f ::</span> a <span class="ot">-&gt;</span> <span class="dt">String</span></a></code></pre></div>
<p>and the following instances:</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">instance</span> <span class="dt">C</span> <span class="dt">Char</span> <span class="kw">where</span></a>
<a class="sourceLine" id="cb18-2" data-line-number="2">  f _ <span class="fu">=</span> <span class="st">&quot;Char&quot;</span></a>
<a class="sourceLine" id="cb18-3" data-line-number="3"></a>
<a class="sourceLine" id="cb18-4" data-line-number="4"><span class="kw">instance</span> <span class="dt">C</span> a <span class="ot">=&gt;</span> <span class="dt">C</span> [a] <span class="kw">where</span></a>
<a class="sourceLine" id="cb18-5" data-line-number="5">  f (x<span class="fu">:</span>_) <span class="fu">=</span> <span class="st">&quot;List of &quot;</span> <span class="fu">++</span> f x</a></code></pre></div>
<p>Invoking <code>f</code> on values of the <code>Char</code> and <code>Char</code> types will work like that.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','74a7fbad17d28eb25dab284de18785a4','74a7fbad17d28eb25dab284de18785a4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea74a7fbad17d28eb25dab284de18785a4" value=":t f" /><br /><div class="answer" id="res74a7fbad17d28eb25dab284de18785a4"><code class="result">f</code><code> :: </code><code class="type">C a =&gt; a -&gt; String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','a8e15998649997715743a60c45e3e5e0','a8e15998649997715743a60c45e3e5e0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa8e15998649997715743a60c45e3e5e0" value="f 'A'" /><br /><div class="answer" id="resa8e15998649997715743a60c45e3e5e0"><code class="result">&quot;Char&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','d5d82a58cd5c7440038f313fa204dd6c','d5d82a58cd5c7440038f313fa204dd6c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread5d82a58cd5c7440038f313fa204dd6c" value="f ['A','B','C']" /><br /><div class="answer" id="resd5d82a58cd5c7440038f313fa204dd6c"><code class="result">&quot;List of Char&quot;</code><code> :: </code><code class="type">String</code></div></form>
<p>But adding the following instance</p>
<pre><code>instance C [Char] where
  f _ = &quot;String&quot;</code></pre>
<p>will make the compiler complain:</p>
<pre><code>    Illegal instance declaration for `C [Char]&#39;
      (All instance types must be of the form (T a1 ... an)
       where a1 ... an are *distinct type variables*,
       and each type variable appears at most once in the instance head.
       Use -XFlexibleInstances if you want to disable this.)
    In the instance declaration for `C [Char]&#39;</code></pre>
<p>By the Haskell 98 standard, it is not allowed to bound the value of the type variable, such as setting <code>a</code> to <code>Char</code>. As the message above suggests, the <code>FlexibleInstances</code> extension of GHC can disable this. But this gives rise to another problem when <code>f</code> is invoked.</p>
<pre><code>Overlapping instances for C [Char] arising from a use of `f&#39;
Matching instances:
  instance C a =&gt; C [a] -- Defined in `main&#39;
  instance C [Char] -- Defined in `main&#39;</code></pre>
<p>Another extension, called <code>OverlappingInstances</code>, may be used to fix the problem. By enabling this extension, the compiler will choose the most specific instantiation.</p>
<p>None of these extensions are required, though. The programmer may control this manually by creating a new type alias for each of the cases.</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="kw">newtype</span> <span class="dt">NString</span> <span class="fu">=</span> <span class="dt">S</span> [<span class="dt">Char</span>]</a>
<a class="sourceLine" id="cb22-2" data-line-number="2"></a>
<a class="sourceLine" id="cb22-3" data-line-number="3"><span class="kw">instance</span> <span class="dt">C</span> <span class="dt">NString</span> <span class="kw">where</span></a>
<a class="sourceLine" id="cb22-4" data-line-number="4">  f (<span class="dt">S</span> _) <span class="fu">=</span> <span class="st">&quot;String&quot;</span></a></code></pre></div>
<p>It works perfectly and incurs no performance overhead.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_TypeClasses_en.hs','64f4e12eca2cece9b2961ad9101018ae','64f4e12eca2cece9b2961ad9101018ae');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea64f4e12eca2cece9b2961ad9101018ae" value="f (S &quot;ABC&quot;)" /><br /><div class="answer" id="res64f4e12eca2cece9b2961ad9101018ae"><code class="result">&quot;String&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
</body>
</html>

