<?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>Data Type Definitions</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">Data Type Definitions</h1>
<div id="info"></div>
<ul>
<li><a href="#data-types">Data Types</a></li>
<li><a href="#type-synonyms">Type Synonyms</a></li>
<li><a href="#parametrized-synonyms">Parametrized Synonyms</a><ul>
<li><a href="#exercise">Exercise</a></li>
<li><a href="#exercise-1">Exercise</a></li>
<li><a href="#exercise-2">Exercise</a></li>
</ul></li>
<li><a href="#newtype-definition">Newtype Definition</a></li>
<li><a href="#some-useful-type-classes">Some useful type classes</a></li>
<li><a href="#deriving-construct"><code>deriving</code> Construct</a></li>
<li><a href="#exercise-3">Exercise</a><ul>
<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="#algebraic-data-types-with-one-constructor">Algebraic Data Types with One Constructor</a></li>
<li><a href="#exercise-7">Exercise</a></li>
<li><a href="#records">Records</a></li>
<li><a href="#type-newtype-and-data"><code>type</code>, <code>newtype</code> and <code>data</code></a></li>
<li><a href="#more-than-one-constructor">More than One Constructor</a><ul>
<li><a href="#exercise-8">Exercise</a></li>
</ul></li>
<li><a href="#differences-between-type-newtype-and-data">Differences between <code>type</code>, <code>newtype</code>, and <code>data</code></a></li>
<li><a href="#bool-char-int"><code>Bool</code>, <code>Char</code>, <code>Int</code></a></li>
<li><a href="#constructors-with-parameters">Constructors with Parameters</a></li>
<li><a href="#parametric-data">Parametric Data</a><ul>
<li><a href="#exercise-9">Exercise</a></li>
</ul></li>
<li><a href="#prelude.either"><code>Prelude.Either</code></a></li>
<li><a href="#more-parameterized-types">More parameterized types</a></li>
<li><a href="#kind-of-types">Kind of Types</a></li>
<li><a href="#peano-numbers">Peano Numbers</a><ul>
<li><a href="#exercise-10">Exercise</a></li>
<li><a href="#exercise-11">Exercise</a></li>
</ul></li>
<li><a href="#lists">Lists</a></li>
<li><a href="#binary-trees">Binary Trees</a><ul>
<li><a href="#exercise-12">Exercise</a></li>
<li><a href="#exercise-13">Exercise</a></li>
<li><a href="#exercise-14">Exercise</a></li>
<li><a href="#exercise-15">Exercise</a></li>
<li><a href="#exercise-16">Exercise</a></li>
<li><a href="#exercise-17">Exercise</a></li>
<li><a href="#exercise-18">Exercise</a></li>
<li><a href="#exercise-19">Exercise</a></li>
<li><a href="#exercise-20">Exercise</a></li>
<li><a href="#exercise-21">Exercise</a></li>
<li><a href="#exercise-22">Exercise</a></li>
<li><a href="#exercise-23">Exercise</a></li>
<li><a href="#exercise-24">Exercise</a></li>
<li><a href="#exercise-25">Exercise</a></li>
<li><a href="#exercise-26">Exercise</a></li>
<li><a href="#exercise-27">Exercise</a></li>
<li><a href="#exercise-28">Exercise</a></li>
<li><a href="#exercise-29">Exercise</a></li>
<li><a href="#exercise-30">Exercise</a></li>
<li><a href="#exercise-31">Exercise</a></li>
<li><a href="#exercise-32">Exercise</a></li>
<li><a href="#exercise-33">Exercise</a></li>
<li><a href="#exercise-34">Exercise</a></li>
<li><a href="#exercise-35">Exercise</a></li>
<li><a href="#exercise-36">Exercise</a></li>
</ul></li>
</ul>
</div>
<section id="data-types" class="level1">
<h1>Data Types</h1>
<p>We have worked with built-in Haskell data types, such as <code>Int</code>, <code>Integer</code>, <code>Bool</code>, and <code>Float</code>, as well as lists and tuples. It is also possible to define your own data types. All data types must begin with a capital letter.</p>
</section>
<section id="type-synonyms" class="level1">
<h1>Type Synonyms</h1>
<p>A type synonym (using the <code>type</code> syntax) does <em>not</em> create a new data type. Instead, it creates a new name an existing data type. An example of this is <code>String</code>, which can be used interchangeably with <code>[Char]</code>.</p>
<p>Examples:</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">type</span> <span class="dt">String</span> <span class="fu">=</span> [<span class="dt">Char</span>]</a></code></pre></div>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">type</span> <span class="dt">Complex</span> <span class="fu">=</span> (<span class="dt">Double</span>, <span class="dt">Double</span>)</a></code></pre></div>
<p>Exercise:<br />
Define type <code>Year</code> with a synonym.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_9967ed17011c55859f33889281a09ffa.hs','9967ed17011c55859f33889281a09ffa','9967ed17011c55859f33889281a09ffa');"><textarea cols="80" rows="3" id="tarea9967ed17011c55859f33889281a09ffa"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res9967ed17011c55859f33889281a09ffa"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','aacb721e75366722d9f460edea8fed0c','aacb721e75366722d9f460edea8fed0c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaacb721e75366722d9f460edea8fed0c" value="1998 :: Year" /><br /><div class="answer" id="resaacb721e75366722d9f460edea8fed0c"></div></form>
<p>Exercise:<br />
Define positions on the chessboard as pairs of characters and integers.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_3ce88be82a893365e742fe3477c030e5.hs','3ce88be82a893365e742fe3477c030e5','3ce88be82a893365e742fe3477c030e5');"><textarea cols="80" rows="3" id="tarea3ce88be82a893365e742fe3477c030e5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res3ce88be82a893365e742fe3477c030e5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','4cdee3ce7f7161655e00ec0af3568797','4cdee3ce7f7161655e00ec0af3568797');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4cdee3ce7f7161655e00ec0af3568797" value="('A', 8) :: Square" /><br /><div class="answer" id="res4cdee3ce7f7161655e00ec0af3568797"></div></form>
</section>
<section id="parametrized-synonyms" class="level1">
<h1>Parametrized Synonyms</h1>
<p>Of course functions can have parameters. Data types can also have parameters. Parameter names must start with a lower-case letter.</p>
<p>Example:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">type</span> <span class="dt">Two</span> a <span class="fu">=</span> (a, a)</a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','af77d4b2347a2201638a469f766d49bd','af77d4b2347a2201638a469f766d49bd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf77d4b2347a2201638a469f766d49bd" value="(1,2) :: Two Int" /><br /><div class="answer" id="resaf77d4b2347a2201638a469f766d49bd"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','2bc683d8c07ef9864fa7c180ea46fe41','2bc683d8c07ef9864fa7c180ea46fe41');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2bc683d8c07ef9864fa7c180ea46fe41" value="('x','y') :: Two Char" /><br /><div class="answer" id="res2bc683d8c07ef9864fa7c180ea46fe41"></div></form>
<section id="exercise" class="level2">
<h2>Exercise</h2>
<p>Define list of lists.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_aa650f853d05421896bc0868b430a9bf.hs','aa650f853d05421896bc0868b430a9bf','aa650f853d05421896bc0868b430a9bf');"><textarea cols="80" rows="3" id="tareaaa650f853d05421896bc0868b430a9bf"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resaa650f853d05421896bc0868b430a9bf"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','10c137193e6fea41f2c29e2777a442d2','10c137193e6fea41f2c29e2777a442d2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea10c137193e6fea41f2c29e2777a442d2" value="[[1,2],[3],[],[4,5]] :: ListList Int" /><br /><div class="answer" id="res10c137193e6fea41f2c29e2777a442d2"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','ecddf99ce2bd7e28863658e00d5fcca7','ecddf99ce2bd7e28863658e00d5fcca7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaecddf99ce2bd7e28863658e00d5fcca7" value="[&quot;ab&quot;,&quot;c&quot;,&quot;def&quot;] :: ListList Char" /><br /><div class="answer" id="resecddf99ce2bd7e28863658e00d5fcca7"></div></form>
</section>
<section id="exercise-1" class="level2">
<h2>Exercise</h2>
<p>Define two-dimensional points in general.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_4795cae2de2fc1730b533544eaa8a988.hs','4795cae2de2fc1730b533544eaa8a988','4795cae2de2fc1730b533544eaa8a988');"><textarea cols="80" rows="3" id="tarea4795cae2de2fc1730b533544eaa8a988"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res4795cae2de2fc1730b533544eaa8a988"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','1bc72de06a5e004de0cf16f024bfee89','1bc72de06a5e004de0cf16f024bfee89');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1bc72de06a5e004de0cf16f024bfee89" value="(1,1) :: P2 Int" /><br /><div class="answer" id="res1bc72de06a5e004de0cf16f024bfee89"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9184ba1cfdbb388f398b2537820b9f16','9184ba1cfdbb388f398b2537820b9f16');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9184ba1cfdbb388f398b2537820b9f16" value="(1,1) :: P2 Double" /><br /><div class="answer" id="res9184ba1cfdbb388f398b2537820b9f16"></div></form>
</section>
<section id="exercise-2" class="level2">
<h2>Exercise</h2>
<p>Define predicates.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_a28c2ce488949e29c5818e168854ba99.hs','a28c2ce488949e29c5818e168854ba99','a28c2ce488949e29c5818e168854ba99');"><textarea cols="80" rows="3" id="tareaa28c2ce488949e29c5818e168854ba99"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resa28c2ce488949e29c5818e168854ba99"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','565bd70bdc56af2f52229e09096ff1a2','565bd70bdc56af2f52229e09096ff1a2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea565bd70bdc56af2f52229e09096ff1a2" value="(isAlpha :: PredicateOn Char) 'A'" /><br /><div class="answer" id="res565bd70bdc56af2f52229e09096ff1a2"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','aab0e2f792ab2e047756de263cf8de46','aab0e2f792ab2e047756de263cf8de46');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaab0e2f792ab2e047756de263cf8de46" value="(even    :: Integral a =&gt; PredicateOn a) 2" /><br /><div class="answer" id="resaab0e2f792ab2e047756de263cf8de46"></div></form>
</section>
</section>
<section id="newtype-definition" class="level1">
<h1>Newtype Definition</h1>
<p><code>newtype</code> <em>does</em> create a new data type. <code>newtype</code> introduces a new type whose representation is the same as an existing type.</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="kw">newtype</span> <span class="dt">Name</span> <span class="fu">=</span> <span class="dt">N</span> <span class="dt">String</span></a></code></pre></div>
<ul>
<li>Type name: <code>Name</code></li>
<li><em>Constructor</em> name: <code>N</code></li>
<li>Already existing type: <code>String</code></li>
</ul>
<p>Note that:</p>
<ul>
<li>Unlike type synonyms, it may be used to define recursive types.</li>
<li><code>N</code> coerces a value from type <code>String</code> to type <code>Name</code> without execution overhead.</li>
<li><code>N</code> <span class="math inline">⊥</span> <code>=</code> <span class="math inline">⊥</span></li>
</ul>
<p>Notice the type of the constructor:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','57ed477593aa014193c2a41145d57427','57ed477593aa014193c2a41145d57427');"><div class="answer" id="res57ed477593aa014193c2a41145d57427"><code class="result">N</code><code> :: </code><code class="type">String -&gt; Name</code></div></form>
<p>One can convert between <code>Name</code> and <code>String</code> with constructor <code>N</code>. Constructors can be used in pattern-matching.</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="ot">x ::</span> <span class="dt">Name</span></a>
<a class="sourceLine" id="cb5-2" data-line-number="2">x <span class="fu">=</span> <span class="dt">N</span> <span class="st">&quot;table&quot;</span></a></code></pre></div>
<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">properName ::</span> <span class="dt">Name</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb6-2" data-line-number="2">properName (<span class="dt">N</span> s) <span class="fu">=</span> isUpper (head s)</a></code></pre></div>
<p>A <code>newtype</code> is not just a type synonym. The new type is not equivalent to the underlying type. This will <em>not</em> compile:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" data-line-number="1"></a>
<a class="sourceLine" id="cb7-2" data-line-number="2"><span class="ot">y ::</span> <span class="dt">Name</span></a>
<a class="sourceLine" id="cb7-3" data-line-number="3">y <span class="fu">=</span> <span class="st">&quot;void&quot;</span></a></code></pre></div>
</section>
<section id="some-useful-type-classes" class="level1">
<h1>Some useful type classes</h1>
<p>Type classes are <em>not</em> like classes in Java or C++.</p>
<p>Please look up these type classes in Haskell documentation or using <code>:info</code> command in <code>ghci</code> to learn about their functions and instances.</p>
<ul>
<li><code>Eq</code> - Instances of this class can be compared for equality.</li>
<li><code>Ord</code> - Instances of this class can be compared for order.</li>
<li><code>Show</code> - Instances this class can be converted to a string.</li>
<li><code>Data</code> - Instances of this class can be introspected for value.</li>
<li><code>Typeable</code> - Instances of this class can be introspected for type.</li>
</ul>
<p>Please note that if your data type is not an instance of the given type class, you can’t use the given operation on it. For example, given this declaration:</p>
<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">newtype</span> <span class="dt">AlmostString</span> <span class="fu">=</span> <span class="dt">AS</span> <span class="dt">String</span></a></code></pre></div>
<p>then Haskell doesn’t know how to compare for equality:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9d45574095ca53f7928a1a5303330a62','9d45574095ca53f7928a1a5303330a62');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9d45574095ca53f7928a1a5303330a62" value="AS &quot;Hello&quot; == AS &quot;Goodbye&quot;" /><br /><div class="answer" id="res9d45574095ca53f7928a1a5303330a62"><div class="error"><pre class="normal">&lt;interactive&gt;:1:1: error:
    &#8226; No instance for (Eq AlmostString) arising from a use of &#8216;==&#8217;
    &#8226; In the expression: AS &quot;Hello&quot; == AS &quot;Goodbye&quot;
</pre></div></div></form>
<p>This error message says, basically, “I can’t use the function <code>==</code> because <code>AlmostString</code> is not an instance of <code>Eq</code>.”</p>
</section>
<section id="deriving-construct" class="level1">
<h1><code>deriving</code> Construct</h1>
<p>Some type class instances can be derived automatically:</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">newtype</span> <span class="dt">Name</span> <span class="fu">=</span> <span class="dt">N</span> <span class="dt">String</span></a>
<a class="sourceLine" id="cb9-2" data-line-number="2">   <span class="kw">deriving</span> (<span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Show</span>, <span class="dt">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<p><code>Name</code> does not have the same limitation as <code>AlmostString</code> above:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','6c5c7dc97c5f43c5685646dddd74ec4b','6c5c7dc97c5f43c5685646dddd74ec4b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6c5c7dc97c5f43c5685646dddd74ec4b" value="N &quot;Hello&quot; == N &quot;Goodbye&quot;" /><br /><div class="answer" id="res6c5c7dc97c5f43c5685646dddd74ec4b"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<p>The reason is that we have asked Haskell to make <code>Name</code> an instance of <code>Eq</code>. Haskell can do this automatically, because <code>String</code> is also an instance of <code>Eq</code>.</p>
</section>
<section id="exercise-3" class="level1">
<h1>Exercise</h1>
<p>Redefine <code>Square</code> as <code>Square'</code> with <code>newtype</code>! Let the constructor be <code>S</code>.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_7bb5b81bd2f4976ea932f82426ba2863.hs','7bb5b81bd2f4976ea932f82426ba2863','7bb5b81bd2f4976ea932f82426ba2863');"><textarea cols="80" rows="4" id="tarea7bb5b81bd2f4976ea932f82426ba2863"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res7bb5b81bd2f4976ea932f82426ba2863"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','3efd7f4df1456fe4df376db9dab9e6ba','3efd7f4df1456fe4df376db9dab9e6ba');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3efd7f4df1456fe4df376db9dab9e6ba" value="S ('A', 8) :: Square'" /><br /><div class="answer" id="res3efd7f4df1456fe4df376db9dab9e6ba"><code class="result">S ('A', 8)</code><code> :: </code><code class="type">Square'</code></div></form>
<p>Define a <em>smart constructor</em> <code>s</code>, which is a function which checks proper construction of chess board positions. Use the <code>error</code> function to report an invalid parameter. Note that chess boards are 8x8 grids.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','a718f4b81c47a9e442269c29e5e6b322','a718f4b81c47a9e442269c29e5e6b322');"><div class="answer" id="resa718f4b81c47a9e442269c29e5e6b322"><code class="result">error</code><code> :: </code><code class="type">[Char] -&gt; a</code></div></form>
<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="ot">s ::</span> (<span class="dt">Char</span>, <span class="dt">Int</span>) <span class="ot">-&gt;</span> <span class="dt">Square&#39;</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_c0511030bccc1fc1b0e0cfce6bca8b3a.hs','c0511030bccc1fc1b0e0cfce6bca8b3a','c0511030bccc1fc1b0e0cfce6bca8b3a');"><textarea cols="80" rows="5" id="tareac0511030bccc1fc1b0e0cfce6bca8b3a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resc0511030bccc1fc1b0e0cfce6bca8b3a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9592c9fc199fe4327d1a9c8c9ef58659','9592c9fc199fe4327d1a9c8c9ef58659');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9592c9fc199fe4327d1a9c8c9ef58659" value="s ('A',3)" /><br /><div class="answer" id="res9592c9fc199fe4327d1a9c8c9ef58659"><code class="result">S ('A', 3)</code><code> :: </code><code class="type">Square'</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','154793002a5dddd58588968091b7cc98','154793002a5dddd58588968091b7cc98');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea154793002a5dddd58588968091b7cc98" value="s ('A',42)" /><br /><div class="answer" id="res154793002a5dddd58588968091b7cc98"><code class="result">&#8869;&#8321;</code><code> :: </code><code class="type">Square'</code><br /><div class="error"><pre class="normal">&#8869;&#8321;: wrong
CallStack (from HasCallStack):
  error, called at ./FL_ADT_en.lhs:188:20 in main:FL_ADT_en</pre></div></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','f86b55decf73f444340dae2b4f6e7182','f86b55decf73f444340dae2b4f6e7182');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf86b55decf73f444340dae2b4f6e7182" value="s ('Z',3)" /><br /><div class="answer" id="resf86b55decf73f444340dae2b4f6e7182"><code class="result">&#8869;&#8321;</code><code> :: </code><code class="type">Square'</code><br /><div class="error"><pre class="normal">&#8869;&#8321;: wrong
CallStack (from HasCallStack):
  error, called at ./FL_ADT_en.lhs:188:20 in main:FL_ADT_en</pre></div></div></form>
<section id="exercise-4" class="level2">
<h2>Exercise</h2>
<p>Define the <code>Vector</code> type (as a <code>newtype</code>) that represents a two-dimensional vector of integers. Let the constructor be <code>V</code>.</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_7a21639a67f292177e38614474f2087f.hs','7a21639a67f292177e38614474f2087f','7a21639a67f292177e38614474f2087f');"><textarea cols="80" rows="4" id="tarea7a21639a67f292177e38614474f2087f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res7a21639a67f292177e38614474f2087f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','af77e0ab5f2d5d139ab4e52308888036','af77e0ab5f2d5d139ab4e52308888036');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf77e0ab5f2d5d139ab4e52308888036" value="V (0,0) :: Vector" /><br /><div class="answer" id="resaf77e0ab5f2d5d139ab4e52308888036"><code class="result">V (0, 0)</code><code> :: </code><code class="type">Vector</code></div></form>
</section>
<section id="exercise-5" class="level2">
<h2>Exercise</h2>
<p>Define a function that determines if two <code>Vector</code>s are equal.</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="ot">vectorEq ::</span> <span class="dt">Vector</span> <span class="ot">-&gt;</span> <span class="dt">Vector</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_b7d8185da70355b4625c00578deb308b.hs','b7d8185da70355b4625c00578deb308b','b7d8185da70355b4625c00578deb308b');"><textarea cols="80" rows="3" id="tareab7d8185da70355b4625c00578deb308b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb7d8185da70355b4625c00578deb308b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9bcad7f6c6958baac3a1f245d325a127','9bcad7f6c6958baac3a1f245d325a127');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9bcad7f6c6958baac3a1f245d325a127" value="V (0,0) `vectorEq` V (0,0)" /><br /><div class="answer" id="res9bcad7f6c6958baac3a1f245d325a127"><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_ADT_en.hs','8cf828e048243ceb37515186b417091a','8cf828e048243ceb37515186b417091a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8cf828e048243ceb37515186b417091a" value="not $ V (-1,2) `vectorEq` V (1,-2)" /><br /><div class="answer" id="res8cf828e048243ceb37515186b417091a"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-6" class="level2">
<h2>Exercise</h2>
<p>Define addition over the of the <code>Vector</code> type.</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="ot">vectorAdd ::</span> <span class="dt">Vector</span> <span class="ot">-&gt;</span> <span class="dt">Vector</span> <span class="ot">-&gt;</span> <span class="dt">Vector</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_f9c31d77d8e58ebe6e023e1a77112cf7.hs','f9c31d77d8e58ebe6e023e1a77112cf7','f9c31d77d8e58ebe6e023e1a77112cf7');"><textarea cols="80" rows="3" id="tareaf9c31d77d8e58ebe6e023e1a77112cf7"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf9c31d77d8e58ebe6e023e1a77112cf7"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','948b46df0c91734dfac9dd9a96b1b874','948b46df0c91734dfac9dd9a96b1b874');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea948b46df0c91734dfac9dd9a96b1b874" value="V (1,-3) `vectorAdd` V (-2,4)" /><br /><div class="answer" id="res948b46df0c91734dfac9dd9a96b1b874"><code class="result">V (-1, 1)</code><code> :: </code><code class="type">Vector</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','00bbf6f7354f81a3499e38b5aa2981d5','00bbf6f7354f81a3499e38b5aa2981d5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea00bbf6f7354f81a3499e38b5aa2981d5" value="V (-1,1) `vectorAdd` V (4,2)" /><br /><div class="answer" id="res00bbf6f7354f81a3499e38b5aa2981d5"><code class="result">V (3, 3)</code><code> :: </code><code class="type">Vector</code></div></form>
</section>
</section>
<section id="algebraic-data-types-with-one-constructor" class="level1">
<h1>Algebraic Data Types with One Constructor</h1>
<p>Algebraic data type (variant type, ADT for short) is a data type each of whose values are derived from other data types, expressed by one of its constructors.</p>
<p>ADTs can be defined like that:</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="kw">data</span> <span class="dt">IPoint</span> <span class="fu">=</span> <span class="dt">P</span> <span class="dt">Int</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb13-2" data-line-number="2">  <span class="kw">deriving</span> (<span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Show</span>, <span class="dt">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<ul>
<li><code>data</code> keyword</li>
<li><code>IPoint</code> type constructor (type name)</li>
<li><code>P</code> constructor,</li>
<li>which may have more than one parameter!</li>
</ul>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','26cd6236ae89ab75fdbedf7963f20936','26cd6236ae89ab75fdbedf7963f20936');"><div class="answer" id="res26cd6236ae89ab75fdbedf7963f20936"><code class="result">P</code><code> :: </code><code class="type">Int -&gt; Int -&gt; IPoint</code></div></form>
<p>Note that <code>P</code> <span class="math inline">⊥</span> <span class="math inline">⊥</span> <span class="math inline">≠</span> <span class="math inline">⊥</span>.</p>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','ea3b39f0d8e3b16ec98dfdda3457e184','ea3b39f0d8e3b16ec98dfdda3457e184');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaea3b39f0d8e3b16ec98dfdda3457e184" value="P 0 0 :: IPoint" /><br /><div class="answer" id="resea3b39f0d8e3b16ec98dfdda3457e184"></div></form>
<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="ot">mirrorO ::</span> <span class="dt">IPoint</span> <span class="ot">-&gt;</span> <span class="dt">IPoint</span></a>
<a class="sourceLine" id="cb14-2" data-line-number="2">mirrorO (<span class="dt">P</span> x y) <span class="fu">=</span> <span class="dt">P</span> (<span class="fu">-</span>x) (<span class="fu">-</span>y)</a></code></pre></div>
<p>This also illustrates a way of how algebraic data types may be obtained, it is called a product of types. There is a special type, called “unit”, which is the product of no types. It is defined in Haskell as follows:</p>
<pre><code>data () = ()</code></pre>
</section>
<section id="exercise-7" class="level1">
<h1>Exercise</h1>
<p>Define translation on plane.</p>
<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="ot">translate ::</span> (<span class="dt">Int</span>, <span class="dt">Int</span>) <span class="ot">-&gt;</span> <span class="dt">IPoint</span> <span class="ot">-&gt;</span> <span class="dt">IPoint</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_51f4687fccbeb46b859ed343af3b3d41.hs','51f4687fccbeb46b859ed343af3b3d41','51f4687fccbeb46b859ed343af3b3d41');"><textarea cols="80" rows="3" id="tarea51f4687fccbeb46b859ed343af3b3d41"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res51f4687fccbeb46b859ed343af3b3d41"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9a9ec1520a9050c4bc4f46fafdae4ed4','9a9ec1520a9050c4bc4f46fafdae4ed4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9a9ec1520a9050c4bc4f46fafdae4ed4" value="translate (1,3) (P 2 2)" /><br /><div class="answer" id="res9a9ec1520a9050c4bc4f46fafdae4ed4"><code class="result">P 3 5</code><code> :: </code><code class="type">IPoint</code></div></form>
</section>
<section id="records" class="level1">
<h1>Records</h1>
<p>Product types can also be given as records, for which the components of the tuples can be accessed by labels.</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">data</span> <span class="dt">RIPoint</span> <span class="fu">=</span> <span class="dt">RIP</span> {<span class="ot"> rip_x ::</span> <span class="dt">Int</span>,<span class="ot"> rip_y ::</span> <span class="dt">Int</span> }</a>
<a class="sourceLine" id="cb17-2" data-line-number="2">  <span class="kw">deriving</span> (<span class="dt">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<p>Literals for that type may be defined using the regular way.</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="ot">origo ::</span> <span class="dt">RIPoint</span></a>
<a class="sourceLine" id="cb18-2" data-line-number="2">origo <span class="fu">=</span> <span class="dt">RIP</span> <span class="dv">0</span> <span class="dv">0</span></a></code></pre></div>
<p>Or using the respective labels. Note that the labels in the definition below may be enumerated in any order.</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="ot">origo&#39; ::</span> <span class="dt">RIPoint</span></a>
<a class="sourceLine" id="cb19-2" data-line-number="2">origo&#39; <span class="fu">=</span> <span class="dt">RIP</span> { rip_y <span class="fu">=</span> <span class="dv">0</span>, rip_x <span class="fu">=</span> <span class="dv">0</span> }</a></code></pre></div>
<p>In Haskell, functions with the same name are generated automatically for the labels. That is why they have to be unique per module (independently of the nesting record definition) and cannot have the name of an existing function in the module.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','0880c18b0b8dbcaf7008b1dde002214a','0880c18b0b8dbcaf7008b1dde002214a');"><div class="answer" id="res0880c18b0b8dbcaf7008b1dde002214a"><code class="result">rip_x</code><code> :: </code><code class="type">RIPoint -&gt; Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','cf43268ed556716ab6df03707e905169','cf43268ed556716ab6df03707e905169');"><div class="answer" id="rescf43268ed556716ab6df03707e905169"><code class="result">rip_y</code><code> :: </code><code class="type">RIPoint -&gt; Int</code></div></form>
<p>Similar functions could be easily defined for the previous definitions as well. For example:</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="ot">ip_x ::</span> <span class="dt">IPoint</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb20-2" data-line-number="2">ip_x (<span class="dt">P</span> x _) <span class="fu">=</span> x</a></code></pre></div>
<p>And the following works too.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','14736397bbf8fc1d53468f569edda42f','14736397bbf8fc1d53468f569edda42f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea14736397bbf8fc1d53468f569edda42f" value="rip_x origo" /><br /><div class="answer" id="res14736397bbf8fc1d53468f569edda42f"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
<p>In addition to this, records feature a so-called <em>record update syntax</em> which makes it possible to change only certain fields of an existing record value.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','39952888398805f2077fa0447d725647','39952888398805f2077fa0447d725647');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea39952888398805f2077fa0447d725647" value="origo { rip_x = 1 }" /><br /><div class="answer" id="res39952888398805f2077fa0447d725647"><code class="result">RIP 1 0</code><code> :: </code><code class="type">RIPoint</code></div></form>
<p>The record syntax may work for pattern matching.</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb21-1" data-line-number="1"><span class="ot">isOrigo ::</span> <span class="dt">RIPoint</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb21-2" data-line-number="2">isOrigo (<span class="dt">RIP</span> { rip_y <span class="fu">=</span> y, rip_x <span class="fu">=</span> x }) <span class="fu">=</span> (x <span class="fu">==</span> <span class="dv">0</span>) <span class="fu">&amp;&amp;</span> (y <span class="fu">==</span> <span class="dv">0</span>)</a></code></pre></div>
</section>
<section id="type-newtype-and-data" class="level1">
<h1><code>type</code>, <code>newtype</code> and <code>data</code></h1>
<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">type</span>    <span class="dt">IPoint</span>   <span class="fu">=</span> (<span class="dt">Int</span>, <span class="dt">Int</span>)</a>
<a class="sourceLine" id="cb22-2" data-line-number="2"><span class="kw">newtype</span> <span class="dt">IPoint</span>   <span class="fu">=</span> <span class="dt">P</span> (<span class="dt">Int</span>, <span class="dt">Int</span>)</a>
<a class="sourceLine" id="cb22-3" data-line-number="3"><span class="kw">data</span>    <span class="dt">IPoint</span>   <span class="fu">=</span> <span class="dt">P</span> <span class="dt">Int</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb22-4" data-line-number="4"><span class="kw">data</span>    <span class="dt">IPoint</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>2nd and 3rd are isomorphic, but syntax and usage is different.</p>
</section>
<section id="more-than-one-constructor" class="level1">
<h1>More than One Constructor</h1>
<p>Algebraic data types may be added up:</p>
<ul>
<li>The type is expressed as sum of other types.</li>
<li>Values of the type could take several different, but fixed types.</li>
<li>Only one of those types can be in use at a time.</li>
</ul>
<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Direction</span></a>
<a class="sourceLine" id="cb23-2" data-line-number="2">     <span class="fu">=</span> <span class="dt">L</span></a>
<a class="sourceLine" id="cb23-3" data-line-number="3">     <span class="fu">|</span> <span class="dt">R</span></a>
<a class="sourceLine" id="cb23-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">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<ul>
<li><code>Direction</code> type constructor</li>
<li><code>L :: Direction</code> constructor</li>
<li><code>R :: Direction</code> constructor</li>
</ul>
<p>This is called an enumerated type.</p>
<section id="exercise-8" class="level2">
<h2>Exercise</h2>
<p>Count <code>L</code> direction in a list of directions.</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="ot">numOfLs ::</span> [<span class="dt">Direction</span>] <span class="ot">-&gt;</span> <span class="dt">Int</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_fe5760b577474566da072056b811dd12.hs','fe5760b577474566da072056b811dd12','fe5760b577474566da072056b811dd12');"><textarea cols="80" rows="3" id="tareafe5760b577474566da072056b811dd12"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resfe5760b577474566da072056b811dd12"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','aeda544741dea3bfba9942e0b37e0d30','aeda544741dea3bfba9942e0b37e0d30');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaeda544741dea3bfba9942e0b37e0d30" value="numOfLs [L,R,L,L,R]" /><br /><div class="answer" id="resaeda544741dea3bfba9942e0b37e0d30"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
</section>
</section>
<section id="differences-between-type-newtype-and-data" class="level1">
<h1>Differences between <code>type</code>, <code>newtype</code>, and <code>data</code></h1>
<table>
<thead>
<tr class="header">
<th>attribute</th>
<th style="text-align: left;"><code>type</code></th>
<th style="text-align: left;"><code>newtype</code></th>
<th style="text-align: left;"><code>data</code></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>synonym?</td>
<td style="text-align: left;">yes</td>
<td style="text-align: left;">no</td>
<td style="text-align: left;">no</td>
</tr>
<tr class="even">
<td>constructor?</td>
<td style="text-align: left;">no</td>
<td style="text-align: left;">single</td>
<td style="text-align: left;">multiple</td>
</tr>
<tr class="odd">
<td>multiple constructor parameters?</td>
<td style="text-align: left;">no</td>
<td style="text-align: left;">no</td>
<td style="text-align: left;">yes</td>
</tr>
<tr class="even">
<td>automatic type class deriving?</td>
<td style="text-align: left;">implicit</td>
<td style="text-align: left;">explicit</td>
<td style="text-align: left;">explicit</td>
</tr>
</tbody>
</table>
</section>
<section id="bool-char-int" class="level1">
<h1><code>Bool</code>, <code>Char</code>, <code>Int</code></h1>
<p>Definition of <code>Bool</code>:</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Bool</span> </a>
<a class="sourceLine" id="cb25-2" data-line-number="2">     <span class="fu">=</span> <span class="dt">False</span> </a>
<a class="sourceLine" id="cb25-3" data-line-number="3">     <span class="fu">|</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb25-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>, <span class="dt">Enum</span>)</a></code></pre></div>
<p>Theoretical definition of <code>Char</code>:</p>
<div class="sourceCode" id="cb26"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Char</span> </a>
<a class="sourceLine" id="cb26-2" data-line-number="2">     <span class="fu">=</span> <span class="ch">&#39;\NUL&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\SOH&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\STX&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\ETX&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\EOT&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\ENQ&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\ACK&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\a&#39;</span> </a>
<a class="sourceLine" id="cb26-3" data-line-number="3">     <span class="fu">|</span> <span class="ch">&#39;\b&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;\t&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;\n&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;\v&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;\f&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;\r&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;\SO&#39;</span>  <span class="fu">|</span> <span class="ch">&#39;\SI&#39;</span> </a>
<a class="sourceLine" id="cb26-4" data-line-number="4">     <span class="fu">|</span> <span class="ch">&#39;\DLE&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\DC1&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\DC2&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\DC3&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\DC4&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\NAK&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\SYN&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\ETB&#39;</span> </a>
<a class="sourceLine" id="cb26-5" data-line-number="5">     <span class="fu">|</span> <span class="ch">&#39;\CAN&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\EM&#39;</span>  <span class="fu">|</span> <span class="ch">&#39;\SUB&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\ESC&#39;</span> <span class="fu">|</span> <span class="ch">&#39;\FS&#39;</span>  <span class="fu">|</span> <span class="ch">&#39;\GS&#39;</span>  <span class="fu">|</span> <span class="ch">&#39;\RS&#39;</span>  <span class="fu">|</span> <span class="ch">&#39;\US&#39;</span> </a>
<a class="sourceLine" id="cb26-6" data-line-number="6">     <span class="fu">|</span> <span class="ch">&#39; &#39;</span>    <span class="fu">|</span> <span class="ch">&#39;!&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;\&quot;&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;#&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;$&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;%&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;&amp;&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;&#39;&#39;</span>    </a>
<a class="sourceLine" id="cb26-7" data-line-number="7">     <span class="fu">|</span> <span class="ch">&#39;(&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;)&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;*&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;+&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;,&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;-&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;.&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;/&#39;</span>    </a>
<a class="sourceLine" id="cb26-8" data-line-number="8">     <span class="fu">|</span> <span class="ch">&#39;0&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;1&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;2&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;3&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;4&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;5&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;6&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;7&#39;</span>    </a>
<a class="sourceLine" id="cb26-9" data-line-number="9">     <span class="fu">|</span> <span class="ch">&#39;8&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;9&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;:&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;;&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;&lt;&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;=&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;&gt;&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;?&#39;</span>    </a>
<a class="sourceLine" id="cb26-10" data-line-number="10">     <span class="fu">|</span> <span class="ch">&#39;@&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;A&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;B&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;C&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;D&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;E&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;F&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;G&#39;</span>    </a>
<a class="sourceLine" id="cb26-11" data-line-number="11">     <span class="fu">|</span> <span class="ch">&#39;H&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;I&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;J&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;K&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;L&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;M&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;N&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;O&#39;</span>    </a>
<a class="sourceLine" id="cb26-12" data-line-number="12">     <span class="fu">|</span> <span class="ch">&#39;P&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;Q&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;R&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;S&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;T&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;U&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;V&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;W&#39;</span>    </a>
<a class="sourceLine" id="cb26-13" data-line-number="13">     <span class="fu">|</span> <span class="ch">&#39;X&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;Y&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;Z&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;[&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;\\&#39;</span>   <span class="fu">|</span> <span class="ch">&#39;]&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;^&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;_&#39;</span>    </a>
<a class="sourceLine" id="cb26-14" data-line-number="14">     <span class="fu">|</span> <span class="ch">&#39;`&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;a&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;b&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;c&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;d&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;e&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;f&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;g&#39;</span>    </a>
<a class="sourceLine" id="cb26-15" data-line-number="15">     <span class="fu">|</span> <span class="ch">&#39;h&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;i&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;j&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;k&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;l&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;m&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;n&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;o&#39;</span>    </a>
<a class="sourceLine" id="cb26-16" data-line-number="16">     <span class="fu">|</span> <span class="ch">&#39;p&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;q&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;r&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;s&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;t&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;u&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;v&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;w&#39;</span>    </a>
<a class="sourceLine" id="cb26-17" data-line-number="17">     <span class="fu">|</span> <span class="ch">&#39;x&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;y&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;z&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;{&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;|&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;}&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;~&#39;</span>    <span class="fu">|</span> <span class="ch">&#39;\DEL&#39;</span> </a>
<a class="sourceLine" id="cb26-18" data-line-number="18">     <span class="fu">|</span> <span class="fu">...</span>     <span class="co">-- 1114112 constructor</span></a>
<a class="sourceLine" id="cb26-19" data-line-number="19">         <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>, <span class="dt">Enum</span>)</a></code></pre></div>
<p>Theoretical definition of <code>Int</code>:</p>
<div class="sourceCode" id="cb27"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Int</span> <span class="fu">=</span> <span class="fu">-</span><span class="dv">2147483648</span> <span class="fu">|</span> <span class="fu">-</span><span class="dv">2147483647</span> <span class="fu">|</span> <span class="fu">...</span> <span class="fu">|</span> <span class="dv">2147483647</span></a></code></pre></div>
</section>
<section id="constructors-with-parameters" class="level1">
<h1>Constructors with Parameters</h1>
<div class="sourceCode" id="cb28"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb28-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Colour</span></a>
<a class="sourceLine" id="cb28-2" data-line-number="2">    <span class="fu">=</span> <span class="dt">Named</span> <span class="dt">String</span></a>
<a class="sourceLine" id="cb28-3" data-line-number="3">    <span class="fu">|</span> <span class="dt">RGB</span> <span class="dt">Int</span> <span class="dt">Int</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb28-4" data-line-number="4">    <span class="fu">|</span> <span class="dt">HSV</span> <span class="dt">Float</span> <span class="dt">Float</span> <span class="dt">Float</span></a>
<a class="sourceLine" id="cb28-5" data-line-number="5">        <span class="kw">deriving</span> (<span class="dt">Show</span>)</a></code></pre></div>
<p>Redundant, do not derive <code>Eq</code>!</p>
<div class="sourceCode" id="cb29"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb29-1" data-line-number="1"><span class="ot">toRGB ::</span> <span class="dt">Colour</span> <span class="ot">-&gt;</span> <span class="dt">Colour</span></a>
<a class="sourceLine" id="cb29-2" data-line-number="2">toRGB (<span class="dt">Named</span> <span class="st">&quot;black&quot;</span>) <span class="fu">=</span> <span class="dt">RGB</span> <span class="dv">0</span>   <span class="dv">0</span>   <span class="dv">0</span></a>
<a class="sourceLine" id="cb29-3" data-line-number="3">toRGB (<span class="dt">Named</span> <span class="st">&quot;white&quot;</span>) <span class="fu">=</span> <span class="dt">RGB</span> <span class="dv">255</span> <span class="dv">255</span> <span class="dv">255</span></a>
<a class="sourceLine" id="cb29-4" data-line-number="4">toRGB (<span class="dt">Named</span> <span class="st">&quot;red&quot;</span>)   <span class="fu">=</span> <span class="dt">RGB</span> <span class="dv">255</span> <span class="dv">0</span>   <span class="dv">0</span></a>
<a class="sourceLine" id="cb29-5" data-line-number="5"><span class="co">-- ...</span></a>
<a class="sourceLine" id="cb29-6" data-line-number="6">toRGB color<span class="fu">@</span>(<span class="dt">RGB</span> r g b) <span class="fu">=</span> color</a>
<a class="sourceLine" id="cb29-7" data-line-number="7"><span class="co">-- toRGB (HSV h s v) = ... -- conversion</span></a></code></pre></div>
</section>
<section id="parametric-data" class="level1">
<h1>Parametric Data</h1>
<p>Useful:</p>
<div class="sourceCode" id="cb30"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb30-1" data-line-number="1"><span class="kw">data</span> <span class="dt">MaybeInt</span></a>
<a class="sourceLine" id="cb30-2" data-line-number="2">    <span class="fu">=</span> <span class="dt">NoInt</span></a>
<a class="sourceLine" id="cb30-3" data-line-number="3">    <span class="fu">|</span> <span class="dt">JustInt</span> <span class="dt">Int</span></a></code></pre></div>
<p>Generalized form:</p>
<div class="sourceCode" id="cb31"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb31-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Maybe</span> a </a>
<a class="sourceLine" id="cb31-2" data-line-number="2">    <span class="fu">=</span> <span class="dt">Nothing</span> </a>
<a class="sourceLine" id="cb31-3" data-line-number="3">    <span class="fu">|</span> <span class="dt">Just</span> a</a>
<a class="sourceLine" id="cb31-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">Typeable</span>, <span class="dt">Data</span>)</a></code></pre></div>
<p>In Java or C++, the absence of value is expressed with a special <code>null</code> value, and each program must check for <code>null</code> values. In Haskell, there is no <code>null</code> value. If you want to express the possibility of no value, use <code>Maybe</code>.</p>
<div class="sourceCode" id="cb32"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb32-1" data-line-number="1"><span class="ot">firstItem ::</span> [a] <span class="ot">-&gt;</span> <span class="dt">Maybe</span> a</a>
<a class="sourceLine" id="cb32-2" data-line-number="2">firstItem [] <span class="fu">=</span> <span class="dt">Nothing</span></a>
<a class="sourceLine" id="cb32-3" data-line-number="3">firstItem (x<span class="fu">:</span>_) <span class="fu">=</span> <span class="dt">Just</span> x</a></code></pre></div>
<section id="exercise-9" class="level2">
<h2>Exercise</h2>
<p>Define a function for taking the first element of a list in safe way.</p>
<div class="sourceCode" id="cb33"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb33-1" data-line-number="1"><span class="ot">safeHead ::</span> [a] <span class="ot">-&gt;</span> <span class="dt">Maybe</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_ff0a9f32a088438e68fa5c2d8be49279.hs','ff0a9f32a088438e68fa5c2d8be49279','ff0a9f32a088438e68fa5c2d8be49279');"><textarea cols="80" rows="4" id="tareaff0a9f32a088438e68fa5c2d8be49279"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resff0a9f32a088438e68fa5c2d8be49279"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','0a5b133d1695f073642d48cebaf896fc','0a5b133d1695f073642d48cebaf896fc');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0a5b133d1695f073642d48cebaf896fc" value="safeHead ([] :: [Int])" /><br /><div class="answer" id="res0a5b133d1695f073642d48cebaf896fc"><code class="result">Nothing</code><code> :: </code><code class="type">Maybe Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','5ba96fdcb4aedb85b2d2b20fefeb3222','5ba96fdcb4aedb85b2d2b20fefeb3222');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5ba96fdcb4aedb85b2d2b20fefeb3222" value="safeHead [1..10]" /><br /><div class="answer" id="res5ba96fdcb4aedb85b2d2b20fefeb3222"><code class="result">Just 1</code><code> :: </code><code class="type">Maybe Integer</code></div></form>
</section>
</section>
<section id="prelude.either" class="level1">
<h1><code>Prelude.Either</code></h1>
<p>Definition of disjoint union:</p>
<div class="sourceCode" id="cb34"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb34-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Either</span> a b</a>
<a class="sourceLine" id="cb34-2" data-line-number="2">   <span class="fu">=</span> <span class="dt">Left</span> a</a>
<a class="sourceLine" id="cb34-3" data-line-number="3">   <span class="fu">|</span> <span class="dt">Right</span> b</a>
<a class="sourceLine" id="cb34-4" data-line-number="4">      <span class="kw">deriving</span> (<span class="dt">Typeable</span>, <span class="dt">Data</span>)</a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','25d3a1542f4618ff580a87cbfac609fd','25d3a1542f4618ff580a87cbfac609fd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea25d3a1542f4618ff580a87cbfac609fd" value="Left  'x'  ::  Either Char a" /><br /><div class="answer" id="res25d3a1542f4618ff580a87cbfac609fd"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','df9e60e0cf6b6a44e0c0864501382395','df9e60e0cf6b6a44e0c0864501382395');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadf9e60e0cf6b6a44e0c0864501382395" value="Right 'x'  ::  Either a    Char" /><br /><div class="answer" id="resdf9e60e0cf6b6a44e0c0864501382395"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','326e6e197221017f288e60d3e59a352b','326e6e197221017f288e60d3e59a352b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea326e6e197221017f288e60d3e59a352b" value="Right True ::  Either a    Bool" /><br /><div class="answer" id="res326e6e197221017f288e60d3e59a352b"></div></form>
<p>We can use <code>Either</code> (and other algebraic data types) to implement heterogeneous lists. Here is a list containing <code>Char</code>s and <code>Bool</code>s. What is its type?</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','ecfd17b9cefb5b0c1e805cccf6abaebe','ecfd17b9cefb5b0c1e805cccf6abaebe');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaecfd17b9cefb5b0c1e805cccf6abaebe" value="[Left 'x', Left 'z', Right True, Left '?'] " /><br /><div class="answer" id="resecfd17b9cefb5b0c1e805cccf6abaebe"></div></form>
</section>
<section id="more-parameterized-types" class="level1">
<h1>More parameterized types</h1>
<div class="sourceCode" id="cb35"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb35-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Param2</span> a b   <span class="fu">=</span>  <span class="dt">Param2</span> a b</a></code></pre></div>
<div class="sourceCode" id="cb36"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb36-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Param3</span> a b c <span class="fu">=</span>  <span class="dt">Param3</span> a b c</a></code></pre></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','da287fb50a01c1d519887d83f2510842','da287fb50a01c1d519887d83f2510842');"><div class="answer" id="resda287fb50a01c1d519887d83f2510842"><code class="result">Param3 'a' True &quot;xx&quot;</code><code> :: </code><code class="type">Param3 Char Bool [Char]</code></div></form>
<p>Imaginary definition (syntax is not correct):</p>
<div class="sourceCode" id="cb37"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb37-1" data-line-number="1"><span class="kw">data</span> (a,b)    <span class="fu">=</span>  (a,b)</a>
<a class="sourceLine" id="cb37-2" data-line-number="2"><span class="kw">data</span> (a,b,c)  <span class="fu">=</span>  (a,b,c)</a></code></pre></div>
</section>
<section id="kind-of-types" class="level1">
<h1>Kind of Types</h1>
<p>All the <code>Maybe</code>, <code>Either</code>, <code>Param2</code>, <code>Param3</code> types are <em>type constructor</em>s or <em>higher-order type</em>s, they are similar to higher-order functions. However, it has to ensured that types are applied correctly in those cases. Hence the <em>kind</em> of types are introduced.</p>
<p>The kind of a type expresses the number of type arguments the given type can have. It is denoted by <code>*</code>, the star symbol. Some examples:</p>
<ul>
<li>Kind <code>*</code>: first-order type, without further parameters.</li>
<li>Kind <code>* -&gt; *</code>: type that can be applied to a first-order type, which then yields another first-order type.</li>
</ul>
<p>GHCi supports querying the kind of a type, since version 7.4:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','d641eb95957e7f8929bfdd5cb86a9647','d641eb95957e7f8929bfdd5cb86a9647');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread641eb95957e7f8929bfdd5cb86a9647" value=":k Int" /><br /><div class="answer" id="resd641eb95957e7f8929bfdd5cb86a9647"><code class="result">Int</code><code> :: </code><code class="type">*</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','452d980bb76994d6c0caff1cd7e9808b','452d980bb76994d6c0caff1cd7e9808b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea452d980bb76994d6c0caff1cd7e9808b" value=":k []" /><br /><div class="answer" id="res452d980bb76994d6c0caff1cd7e9808b"><code class="result">[]</code><code> :: </code><code class="type">* -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','5e9c8e3350a77729d96752f5da4f8ea5','5e9c8e3350a77729d96752f5da4f8ea5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5e9c8e3350a77729d96752f5da4f8ea5" value=":k Maybe" /><br /><div class="answer" id="res5e9c8e3350a77729d96752f5da4f8ea5"><code class="result">Maybe</code><code> :: </code><code class="type">* -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','00a45162c3c69094ed2ad0557050187e','00a45162c3c69094ed2ad0557050187e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea00a45162c3c69094ed2ad0557050187e" value=":k Either" /><br /><div class="answer" id="res00a45162c3c69094ed2ad0557050187e"><code class="result">Either</code><code> :: </code><code class="type">* -&gt; * -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','33b5ebbed4e3b9ac3695813336901170','33b5ebbed4e3b9ac3695813336901170');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea33b5ebbed4e3b9ac3695813336901170" value=":k Param2" /><br /><div class="answer" id="res33b5ebbed4e3b9ac3695813336901170"><code class="result">Param2</code><code> :: </code><code class="type">* -&gt; * -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','cba4a21a3d54f7a214e35bcdac8ba050','cba4a21a3d54f7a214e35bcdac8ba050');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacba4a21a3d54f7a214e35bcdac8ba050" value=":k Param3" /><br /><div class="answer" id="rescba4a21a3d54f7a214e35bcdac8ba050"><code class="result">Param3</code><code> :: </code><code class="type">* -&gt; * -&gt; * -&gt; *</code></div></form>
<p>Note that types are also curried, so they may be applied partially, similarly to functions.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','7810816645e02928c4953aa143de4233','7810816645e02928c4953aa143de4233');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7810816645e02928c4953aa143de4233" value=":k []" /><br /><div class="answer" id="res7810816645e02928c4953aa143de4233"><code class="result">[]</code><code> :: </code><code class="type">* -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','494f5e00a0882e85d69f004355cd496d','494f5e00a0882e85d69f004355cd496d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea494f5e00a0882e85d69f004355cd496d" value=":k [Int]" /><br /><div class="answer" id="res494f5e00a0882e85d69f004355cd496d"><code class="result">[Int]</code><code> :: </code><code class="type">*</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','c49c8ab437a50a4ac18317ea55aad2bf','c49c8ab437a50a4ac18317ea55aad2bf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac49c8ab437a50a4ac18317ea55aad2bf" value=":k (,)" /><br /><div class="answer" id="resc49c8ab437a50a4ac18317ea55aad2bf"><code class="result">(,)</code><code> :: </code><code class="type">* -&gt; * -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','dffd94a16244e3ca198cf9fbae079fb7','dffd94a16244e3ca198cf9fbae079fb7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadffd94a16244e3ca198cf9fbae079fb7" value=":k (,) Int" /><br /><div class="answer" id="resdffd94a16244e3ca198cf9fbae079fb7"><code class="result">(,) Int</code><code> :: </code><code class="type">* -&gt; *</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','e9946767dcb335958222d603a0e53d26','e9946767dcb335958222d603a0e53d26');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae9946767dcb335958222d603a0e53d26" value=":k (,) Int Char" /><br /><div class="answer" id="rese9946767dcb335958222d603a0e53d26"><code class="result">(,) Int Char</code><code> :: </code><code class="type">*</code></div></form>
</section>
<section id="peano-numbers" class="level1">
<h1>Peano Numbers</h1>
<p>We can express natural numbers in Haskell’s type system. This is a recursive definition.</p>
<div class="sourceCode" id="cb38"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb38-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Nat</span></a>
<a class="sourceLine" id="cb38-2" data-line-number="2">    <span class="fu">=</span> <span class="dt">Zero</span></a>
<a class="sourceLine" id="cb38-3" data-line-number="3">    <span class="fu">|</span> <span class="dt">Succ</span> <span class="dt">Nat</span>      <span class="co">-- successor</span></a>
<a class="sourceLine" id="cb38-4" data-line-number="4">        <span class="kw">deriving</span> (<span class="dt">Eq</span>, <span class="dt">Show</span>, <span class="dt">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<section id="exercise-10" class="level2">
<h2>Exercise</h2>
<p>Define constants.</p>
<div class="sourceCode" id="cb39"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb39-1" data-line-number="1"><span class="ot">one ::</span> <span class="dt">Nat</span></a>
<a class="sourceLine" id="cb39-2" data-line-number="2"><span class="ot">two ::</span> <span class="dt">Nat</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_ec525f066382581f772cac9d2b4f774d.hs','ec525f066382581f772cac9d2b4f774d','ec525f066382581f772cac9d2b4f774d');"><textarea cols="80" rows="5" id="tareaec525f066382581f772cac9d2b4f774d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resec525f066382581f772cac9d2b4f774d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','5f5817e609c4cad08a4f4afc826b79b5','5f5817e609c4cad08a4f4afc826b79b5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5f5817e609c4cad08a4f4afc826b79b5" value="one" /><br /><div class="answer" id="res5f5817e609c4cad08a4f4afc826b79b5"><code class="result">Succ Zero</code><code> :: </code><code class="type">Nat</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','b43a2a908634c5c2c41b79ff503d3113','b43a2a908634c5c2c41b79ff503d3113');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab43a2a908634c5c2c41b79ff503d3113" value="two" /><br /><div class="answer" id="resb43a2a908634c5c2c41b79ff503d3113"><code class="result">Succ (Succ Zero)</code><code> :: </code><code class="type">Nat</code></div></form>
</section>
<section id="exercise-11" class="level2">
<h2>Exercise</h2>
<p>Define addition.</p>
<div class="sourceCode" id="cb40"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb40-1" data-line-number="1"><span class="ot">add ::</span> <span class="dt">Nat</span> <span class="ot">-&gt;</span> <span class="dt">Nat</span> <span class="ot">-&gt;</span> <span class="dt">Nat</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_347b337406d1fed5c31ca08af7bd4f9d.hs','347b337406d1fed5c31ca08af7bd4f9d','347b337406d1fed5c31ca08af7bd4f9d');"><textarea cols="80" rows="4" id="tarea347b337406d1fed5c31ca08af7bd4f9d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res347b337406d1fed5c31ca08af7bd4f9d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','7edaa7f9651f078e8d8fea710de18c73','7edaa7f9651f078e8d8fea710de18c73');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7edaa7f9651f078e8d8fea710de18c73" value="one `add` one" /><br /><div class="answer" id="res7edaa7f9651f078e8d8fea710de18c73"><code class="result">Succ (Succ Zero)</code><code> :: </code><code class="type">Nat</code></div></form>
<p>Hint:</p>
<p><img src="FL_ADT_en5cf1703c9dd7cea7ad083c09a978b79f.png" alt="FL_ADT_en5cf1703c9dd7cea7ad083c09a978b79f.png" /></p>
</section>
</section>
<section id="lists" class="level1">
<h1>Lists</h1>
<p>We can define our own list type, equivalent to the built-in list type.</p>
<div class="sourceCode" id="cb41"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb41-1" data-line-number="1"><span class="kw">data</span> <span class="dt">List</span> a           <span class="co">-- [a]</span></a>
<a class="sourceLine" id="cb41-2" data-line-number="2">   <span class="fu">=</span> <span class="dt">Nil</span>              <span class="co">-- []</span></a>
<a class="sourceLine" id="cb41-3" data-line-number="3">   <span class="fu">|</span> <span class="dt">Cons</span> a (<span class="dt">List</span> a)  <span class="co">-- a : [a]</span></a>
<a class="sourceLine" id="cb41-4" data-line-number="4">     <span class="kw">deriving</span> (<span class="dt">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<p>Note that this structure implements a linked-list. Each non-empty node contains a value, and a reference to another node. In Java:</p>
<div class="sourceCode" id="cb42"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb42-1" data-line-number="1"><span class="kw">class</span> <span class="bu">List</span>&lt;E&gt;</a>
<a class="sourceLine" id="cb42-2" data-line-number="2">{</a>
<a class="sourceLine" id="cb42-3" data-line-number="3">  <span class="kw">public</span> E value;</a>
<a class="sourceLine" id="cb42-4" data-line-number="4">  <span class="kw">public</span> <span class="bu">List</span>&lt;E&gt; next; <span class="co">// may be null implicitly</span></a>
<a class="sourceLine" id="cb42-5" data-line-number="5">}</a></code></pre></div>
<p>An example value and its in-memory representation:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','2a20054a79888ba2aeb54ca8c77e6e82','2a20054a79888ba2aeb54ca8c77e6e82');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a20054a79888ba2aeb54ca8c77e6e82" value="Cons 3 (Cons 100 (Cons 50 Nil))" /><br /><div class="answer" id="res2a20054a79888ba2aeb54ca8c77e6e82"><code class="result">Cons 3 (Cons 100 (Cons 50 Nil))</code><code> :: </code><code class="type">List Integer</code></div></form>
<p><img src="FL_ADT_en864977e07cdc43615f38a9bcbcec1979.png" alt="FL_ADT_en864977e07cdc43615f38a9bcbcec1979.png" /></p>
<p>Define the <code>length'</code> function, equivalent to <code>length</code>.</p>
<div class="sourceCode" id="cb43"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb43-1" data-line-number="1"><span class="ot">length&#39; ::</span> <span class="dt">List</span> a <span class="ot">-&gt;</span> <span class="dt">Int</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_8b51e5188c07301df4a7a13fe1089ede.hs','8b51e5188c07301df4a7a13fe1089ede','8b51e5188c07301df4a7a13fe1089ede');"><textarea cols="80" rows="4" id="tarea8b51e5188c07301df4a7a13fe1089ede"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res8b51e5188c07301df4a7a13fe1089ede"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','fb72cccf65c2228de10e19a1bc371498','fb72cccf65c2228de10e19a1bc371498');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafb72cccf65c2228de10e19a1bc371498" value="length' (Cons 'a' (Cons 'b' (Cons 'c' Nil)))" /><br /><div class="answer" id="resfb72cccf65c2228de10e19a1bc371498"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="binary-trees" class="level1">
<h1>Binary Trees</h1>
<p>Similar to the <code>List</code> type above.</p>
<div class="sourceCode" id="cb44"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb44-1" data-line-number="1"><span class="kw">data</span> <span class="dt">Tree</span> a</a>
<a class="sourceLine" id="cb44-2" data-line-number="2">   <span class="fu">=</span> <span class="dt">Leaf</span></a>
<a class="sourceLine" id="cb44-3" data-line-number="3">   <span class="fu">|</span> <span class="dt">Node</span> (<span class="dt">Tree</span> a) a (<span class="dt">Tree</span> a)</a>
<a class="sourceLine" id="cb44-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">Data</span>, <span class="dt">Typeable</span>)</a></code></pre></div>
<p>Notice the types of the constructors:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','d14bcb175f285874df2de1b2f5fadccb','d14bcb175f285874df2de1b2f5fadccb');"><div class="answer" id="resd14bcb175f285874df2de1b2f5fadccb"><code class="result">Leaf</code><code> :: </code><code class="type">Tree a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','5f035efbfdfd20527e3a53cea567a2da','5f035efbfdfd20527e3a53cea567a2da');"><div class="answer" id="res5f035efbfdfd20527e3a53cea567a2da"><code class="result">Node</code><code> :: </code><code class="type">Tree a -&gt; a -&gt; Tree a -&gt; Tree a</code></div></form>
<p>For example:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9b6d1a0a1c51bdcbfc58cdc8067f8b51','9b6d1a0a1c51bdcbfc58cdc8067f8b51');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9b6d1a0a1c51bdcbfc58cdc8067f8b51" value="Node (Node Leaf 'b' (Node Leaf 'e' Leaf)) 'a' (Node (Node Leaf 'z' Leaf) 'c' Leaf)" /><br /><div class="answer" id="res9b6d1a0a1c51bdcbfc58cdc8067f8b51"><code class="result">Node (Node Leaf 'b' (Node Leaf 'e' Leaf)) 'a'
     (Node (Node Leaf 'z' Leaf) 'c' Leaf)</code><code> :: </code><code class="type">Tree Char</code></div></form>
<p><img src="FL_ADT_en029d2a28d2014fed716efe231855f543.png" alt="FL_ADT_en029d2a28d2014fed716efe231855f543.png" /></p>
<section id="exercise-12" class="level2">
<h2>Exercise</h2>
<p>Mirror a tree.</p>
<div class="sourceCode" id="cb45"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb45-1" data-line-number="1"><span class="ot">mirror ::</span> <span class="dt">Tree</span> a <span class="ot">-&gt;</span> <span class="dt">Tree</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_3270074ff1fade329a53c8e50a36cce8.hs','3270074ff1fade329a53c8e50a36cce8','3270074ff1fade329a53c8e50a36cce8');"><textarea cols="80" rows="4" id="tarea3270074ff1fade329a53c8e50a36cce8"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res3270074ff1fade329a53c8e50a36cce8"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','3b0f5b307808367220b972b4c5631173','3b0f5b307808367220b972b4c5631173');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3b0f5b307808367220b972b4c5631173" value="mirror (Node (Node Leaf 'y' Leaf) 'x' Leaf)" /><br /><div class="answer" id="res3b0f5b307808367220b972b4c5631173"><code class="result">Node Leaf 'x' (Node Leaf 'y' Leaf)</code><code> :: </code><code class="type">Tree Char</code></div></form>
</section>
<section id="exercise-13" class="level2">
<h2>Exercise</h2>
<p>Define a fold operation over trees.</p>
<div class="sourceCode" id="cb46"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb46-1" data-line-number="1"><span class="ot">foldTree ::</span> (a <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> <span class="dt">Tree</span> a <span class="ot">-&gt;</span> b</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_3bfcf8d20f7645edb8ed4c35daaf36e0.hs','3bfcf8d20f7645edb8ed4c35daaf36e0','3bfcf8d20f7645edb8ed4c35daaf36e0');"><textarea cols="80" rows="4" id="tarea3bfcf8d20f7645edb8ed4c35daaf36e0"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res3bfcf8d20f7645edb8ed4c35daaf36e0"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','ce3e1176f21badffe9c1c39e8e22c915','ce3e1176f21badffe9c1c39e8e22c915');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareace3e1176f21badffe9c1c39e8e22c915" value="foldTree (\_ x y -&gt; x + y + 1) 0 Leaf" /><br /><div class="answer" id="resce3e1176f21badffe9c1c39e8e22c915"><code class="result">0</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','2a57f6262e5ba21878b9f6fb63978fdd','2a57f6262e5ba21878b9f6fb63978fdd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a57f6262e5ba21878b9f6fb63978fdd" value="foldTree (\_ x y -&gt; x + y + 1) 0 (Node (Node Leaf 'y' Leaf) 'x' Leaf)" /><br /><div class="answer" id="res2a57f6262e5ba21878b9f6fb63978fdd"><code class="result">2</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-14" class="level2">
<h2>Exercise</h2>
<p>Define a function that determines the size of a tree.</p>
<div class="sourceCode" id="cb47"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb47-1" data-line-number="1"><span class="ot">treeSize ::</span> <span class="dt">Tree</span> a <span class="ot">-&gt;</span> <span class="dt">Int</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_e5a854562995aa4300d594b609c31fef.hs','e5a854562995aa4300d594b609c31fef','e5a854562995aa4300d594b609c31fef');"><textarea cols="80" rows="3" id="tareae5a854562995aa4300d594b609c31fef"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese5a854562995aa4300d594b609c31fef"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','b0f03f772614a8689814e85c9b0db161','b0f03f772614a8689814e85c9b0db161');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab0f03f772614a8689814e85c9b0db161" value="treeSize Leaf" /><br /><div class="answer" id="resb0f03f772614a8689814e85c9b0db161"><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_ADT_en.hs','cb713220a360e1f74277ea53a29d4a9e','cb713220a360e1f74277ea53a29d4a9e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacb713220a360e1f74277ea53a29d4a9e" value="treeSize (Node Leaf 42 Leaf)" /><br /><div class="answer" id="rescb713220a360e1f74277ea53a29d4a9e"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','1e160eee6ad4ab9ad7cb7f2dce3303b3','1e160eee6ad4ab9ad7cb7f2dce3303b3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1e160eee6ad4ab9ad7cb7f2dce3303b3" value="treeSize (Node (Node Leaf 'b' (Node Leaf 'c' Leaf)) 'a' (Node Leaf 'd' Leaf))" /><br /><div class="answer" id="res1e160eee6ad4ab9ad7cb7f2dce3303b3"><code class="result">4</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-15" class="level2">
<h2>Exercise</h2>
<p>Define a tree with arbitrary many branches (arbitrary arity). Let the type constructor be <code>T</code> and let the constructor of nodes be also <code>T</code>.</p>
<p><em>Sorry, due to a bug in the system, the right solution will not be accepted.</em></p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_c25d5c1d9b678a63d8cb6c6dda0ecd0a.hs','c25d5c1d9b678a63d8cb6c6dda0ecd0a','c25d5c1d9b678a63d8cb6c6dda0ecd0a');"><textarea cols="80" rows="5" id="tareac25d5c1d9b678a63d8cb6c6dda0ecd0a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resc25d5c1d9b678a63d8cb6c6dda0ecd0a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','ae83e02eea71415506d205015ec9939c','ae83e02eea71415506d205015ec9939c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaae83e02eea71415506d205015ec9939c" value="T 'x' [T 'y' [], T 'z' []]" /><br /><div class="answer" id="resae83e02eea71415506d205015ec9939c"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','060610ce10f96965532bc8730702b66d','060610ce10f96965532bc8730702b66d');"><div class="answer" id="res060610ce10f96965532bc8730702b66d"><code class="result">T 'x' []</code><code> :: </code><code class="type">T Char</code></div></form>
</section>
<section id="exercise-16" class="level2">
<h2>Exercise</h2>
<p>Define an algebraic data type for representing propositional logic formulas with the name <code>LExpr</code>. It shall have the following constructors:</p>
<ul>
<li><code>LLit</code>: literals.</li>
<li><code>LVar</code>: variables with their names as a <code>String</code>.</li>
<li><code>LAnd</code>: logical conjunction (binary).</li>
<li><code>LOr</code>: logical disjunction (binary).</li>
<li><code>LNot</code>: logical negation (unary).</li>
</ul>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_3a9618dfc3cde6065ec58d7a808abb6d.hs','3a9618dfc3cde6065ec58d7a808abb6d','3a9618dfc3cde6065ec58d7a808abb6d');"><textarea cols="80" rows="9" id="tarea3a9618dfc3cde6065ec58d7a808abb6d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res3a9618dfc3cde6065ec58d7a808abb6d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','3093efa83fcf381f0429a788bec7072c','3093efa83fcf381f0429a788bec7072c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3093efa83fcf381f0429a788bec7072c" value="LAnd (LVar &quot;foo&quot;) (LLit False)" /><br /><div class="answer" id="res3093efa83fcf381f0429a788bec7072c"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','71e789570ac790cf2811a95cd98b7d36','71e789570ac790cf2811a95cd98b7d36');"><div class="answer" id="res71e789570ac790cf2811a95cd98b7d36"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-17" class="level2">
<h2>Exercise</h2>
<p>Define constants for the basic logic literals.</p>
<div class="sourceCode" id="cb48"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb48-1" data-line-number="1"><span class="ot">true ::</span> <span class="dt">LExpr</span></a>
<a class="sourceLine" id="cb48-2" data-line-number="2"><span class="ot">false ::</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_77a2385bdc6a2a3ad26c7e12616e859e.hs','77a2385bdc6a2a3ad26c7e12616e859e','77a2385bdc6a2a3ad26c7e12616e859e');"><textarea cols="80" rows="5" id="tarea77a2385bdc6a2a3ad26c7e12616e859e"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res77a2385bdc6a2a3ad26c7e12616e859e"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','3f76fb4596a647147e84b058d0aebfd2','3f76fb4596a647147e84b058d0aebfd2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3f76fb4596a647147e84b058d0aebfd2" value="true" /><br /><div class="answer" id="res3f76fb4596a647147e84b058d0aebfd2"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','6946df53a8ffd75a4a1f1fe11dcc7edf','6946df53a8ffd75a4a1f1fe11dcc7edf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6946df53a8ffd75a4a1f1fe11dcc7edf" value="false" /><br /><div class="answer" id="res6946df53a8ffd75a4a1f1fe11dcc7edf"><code class="result">LLit False</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-18" class="level2">
<h2>Exercise</h2>
<p>Define a function that creates a logic variable with the given name. Note that names shall be only accepted only if they start with an alphabetic character and it cannot be empty.</p>
<div class="sourceCode" id="cb49"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb49-1" data-line-number="1"><span class="ot">var ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_c25baeda43634ca904a54342f35a0048.hs','c25baeda43634ca904a54342f35a0048','c25baeda43634ca904a54342f35a0048');"><textarea cols="80" rows="5" id="tareac25baeda43634ca904a54342f35a0048"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resc25baeda43634ca904a54342f35a0048"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','aadd8052503879a6294c64398d84392b','aadd8052503879a6294c64398d84392b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaadd8052503879a6294c64398d84392b" value="var &quot;A&quot;" /><br /><div class="answer" id="resaadd8052503879a6294c64398d84392b"><code class="result">LVar &quot;A&quot;</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','83a56c09c8df0789daef1898bb5abba9','83a56c09c8df0789daef1898bb5abba9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea83a56c09c8df0789daef1898bb5abba9" value="var &quot;&quot;" /><br /><div class="answer" id="res83a56c09c8df0789daef1898bb5abba9"><code class="result">&#8869;&#8321;</code><code> :: </code><code class="type">LExpr</code><br /><div class="error"><pre class="normal">&#8869;&#8321;: var: invalid variable name
CallStack (from HasCallStack):
  error, called at ./FL_ADT_en.lhs:762:12 in main:FL_ADT_en</pre></div></div></form>
</section>
<section id="exercise-19" class="level2">
<h2>Exercise</h2>
<p>Define a function for the logical conjunction. Note that this function shall perform simplifications whenever possible: if the arguments are literals then the result could be directly calculated, there is no need to map them to the corresponding data constructor.</p>
<div class="sourceCode" id="cb50"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb50-1" data-line-number="1"><span class="kw">infixr</span> <span class="dv">3</span> <span class="ot">`land`</span></a>
<a class="sourceLine" id="cb50-2" data-line-number="2"><span class="ot">land ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_72be16e760f1f6e6295c89c5eb901f8a.hs','72be16e760f1f6e6295c89c5eb901f8a','72be16e760f1f6e6295c89c5eb901f8a');"><textarea cols="80" rows="7" id="tarea72be16e760f1f6e6295c89c5eb901f8a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res72be16e760f1f6e6295c89c5eb901f8a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','4264bfcc055fc62d8a4bc4c109a4ccbb','4264bfcc055fc62d8a4bc4c109a4ccbb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4264bfcc055fc62d8a4bc4c109a4ccbb" value="land true false" /><br /><div class="answer" id="res4264bfcc055fc62d8a4bc4c109a4ccbb"><code class="result">LLit False</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','b0e0847458e32920cf7f08539a9008ec','b0e0847458e32920cf7f08539a9008ec');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab0e0847458e32920cf7f08539a9008ec" value="land (var &quot;A&quot;) true" /><br /><div class="answer" id="resb0e0847458e32920cf7f08539a9008ec"><code class="result">LVar &quot;A&quot;</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','601b3481e17df96e2ccb27184fdd2c6d','601b3481e17df96e2ccb27184fdd2c6d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea601b3481e17df96e2ccb27184fdd2c6d" value="land false (var &quot;B&quot;)" /><br /><div class="answer" id="res601b3481e17df96e2ccb27184fdd2c6d"><code class="result">LLit False</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','8d75cb07bb747ff734a5248931e2af86','8d75cb07bb747ff734a5248931e2af86');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8d75cb07bb747ff734a5248931e2af86" value="land (var &quot;X&quot;) (var &quot;Y&quot;)" /><br /><div class="answer" id="res8d75cb07bb747ff734a5248931e2af86"><code class="result">LAnd (LVar &quot;X&quot;) (LVar &quot;Y&quot;)</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-20" class="level2">
<h2>Exercise</h2>
<p>Define a function for the logical disjunction in the same way it was done for the conjunction.</p>
<div class="sourceCode" id="cb51"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb51-1" data-line-number="1"><span class="kw">infixr</span> <span class="dv">2</span> <span class="ot">`lor`</span></a>
<a class="sourceLine" id="cb51-2" data-line-number="2"><span class="ot">lor ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_53cf32168a8f75e46c56491197cdc53b.hs','53cf32168a8f75e46c56491197cdc53b','53cf32168a8f75e46c56491197cdc53b');"><textarea cols="80" rows="7" id="tarea53cf32168a8f75e46c56491197cdc53b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res53cf32168a8f75e46c56491197cdc53b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','ecb6f05353daecd65ed36551c083eb87','ecb6f05353daecd65ed36551c083eb87');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaecb6f05353daecd65ed36551c083eb87" value="lor true false" /><br /><div class="answer" id="resecb6f05353daecd65ed36551c083eb87"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','65c18306c596a6fbeacc479dd9140d0d','65c18306c596a6fbeacc479dd9140d0d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea65c18306c596a6fbeacc479dd9140d0d" value="lor (var &quot;A&quot;) true" /><br /><div class="answer" id="res65c18306c596a6fbeacc479dd9140d0d"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','dee4a96958f9f55f8248927ca3252a10','dee4a96958f9f55f8248927ca3252a10');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadee4a96958f9f55f8248927ca3252a10" value="lor false (var &quot;B&quot;)" /><br /><div class="answer" id="resdee4a96958f9f55f8248927ca3252a10"><code class="result">LVar &quot;B&quot;</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','84764af45570f38ffc7dc91f58931c49','84764af45570f38ffc7dc91f58931c49');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea84764af45570f38ffc7dc91f58931c49" value="lor (var &quot;X&quot;) (var &quot;Y&quot;)" /><br /><div class="answer" id="res84764af45570f38ffc7dc91f58931c49"><code class="result">LOr (LVar &quot;X&quot;) (LVar &quot;Y&quot;)</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-21" class="level2">
<h2>Exercise</h2>
<p>Define a function for the logical negation. This function shall also perfom simplications on literals.</p>
<div class="sourceCode" id="cb52"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb52-1" data-line-number="1"><span class="ot">lnot ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_961325d043301de388a3a764fbc27466.hs','961325d043301de388a3a764fbc27466','961325d043301de388a3a764fbc27466');"><textarea cols="80" rows="5" id="tarea961325d043301de388a3a764fbc27466"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res961325d043301de388a3a764fbc27466"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','b7c2d1214e98fef1712f102efabfe61e','b7c2d1214e98fef1712f102efabfe61e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab7c2d1214e98fef1712f102efabfe61e" value="lnot true" /><br /><div class="answer" id="resb7c2d1214e98fef1712f102efabfe61e"><code class="result">LLit False</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','2f3a17b47483bc3e48048a6c2d8ec038','2f3a17b47483bc3e48048a6c2d8ec038');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2f3a17b47483bc3e48048a6c2d8ec038" value="lnot false" /><br /><div class="answer" id="res2f3a17b47483bc3e48048a6c2d8ec038"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','6700449203eb63fa8e8ca4b825ac2271','6700449203eb63fa8e8ca4b825ac2271');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6700449203eb63fa8e8ca4b825ac2271" value="lnot (var &quot;P&quot;)" /><br /><div class="answer" id="res6700449203eb63fa8e8ca4b825ac2271"><code class="result">LNot (LVar &quot;P&quot;)</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','bc9bfb4b8507d58d5472f947e77bfa60','bc9bfb4b8507d58d5472f947e77bfa60');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareabc9bfb4b8507d58d5472f947e77bfa60" value="lnot (land (var &quot;X&quot;) (var &quot;Y&quot;))" /><br /><div class="answer" id="resbc9bfb4b8507d58d5472f947e77bfa60"><code class="result">LNot (LAnd (LVar &quot;X&quot;) (LVar &quot;Y&quot;))</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-22" class="level2">
<h2>Exercise</h2>
<p>Define the logical implication in terms of the negation and the disjunction, not as a mapping to a data constructor.</p>
<div class="sourceCode" id="cb53"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb53-1" data-line-number="1"><span class="ot">implies ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_bb1f9c70e4999c1e5a7bcf10580eb993.hs','bb1f9c70e4999c1e5a7bcf10580eb993','bb1f9c70e4999c1e5a7bcf10580eb993');"><textarea cols="80" rows="3" id="tareabb1f9c70e4999c1e5a7bcf10580eb993"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resbb1f9c70e4999c1e5a7bcf10580eb993"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','488a36313c9f8569acb9713f018a1577','488a36313c9f8569acb9713f018a1577');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea488a36313c9f8569acb9713f018a1577" value="true `implies` false" /><br /><div class="answer" id="res488a36313c9f8569acb9713f018a1577"><code class="result">LLit False</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','56aadce6a631c2d2a63eaec3c47ed091','56aadce6a631c2d2a63eaec3c47ed091');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea56aadce6a631c2d2a63eaec3c47ed091" value="false `implies` var &quot;P&quot;" /><br /><div class="answer" id="res56aadce6a631c2d2a63eaec3c47ed091"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','0ddf640517d30bc94966e4ee4bc88d67','0ddf640517d30bc94966e4ee4bc88d67');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0ddf640517d30bc94966e4ee4bc88d67" value="var &quot;C&quot; `implies` var &quot;D&quot;" /><br /><div class="answer" id="res0ddf640517d30bc94966e4ee4bc88d67"><code class="result">LOr (LNot (LVar &quot;C&quot;)) (LVar &quot;D&quot;)</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','d97cbe5f56ef71caf0fd622fd1f42465','d97cbe5f56ef71caf0fd622fd1f42465');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread97cbe5f56ef71caf0fd622fd1f42465" value="(var &quot;A&quot; `lor` var &quot;B&quot;) `implies` var &quot;C&quot;" /><br /><div class="answer" id="resd97cbe5f56ef71caf0fd622fd1f42465"><code class="result">LOr (LNot (LOr (LVar &quot;A&quot;) (LVar &quot;B&quot;))) (LVar &quot;C&quot;)</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-23" class="level2">
<h2>Exercise</h2>
<p>Define a function for logical equivalence (“if and only if”) as a derived function from <code>implies</code> and <code>land</code>.</p>
<div class="sourceCode" id="cb54"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb54-1" data-line-number="1"><span class="ot">iff ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_ea9ce757fd76dfd7af5d0b817e2f5dc8.hs','ea9ce757fd76dfd7af5d0b817e2f5dc8','ea9ce757fd76dfd7af5d0b817e2f5dc8');"><textarea cols="80" rows="3" id="tareaea9ce757fd76dfd7af5d0b817e2f5dc8"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resea9ce757fd76dfd7af5d0b817e2f5dc8"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','bb714c0b09ca2a91e9d748e7edb0db90','bb714c0b09ca2a91e9d748e7edb0db90');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareabb714c0b09ca2a91e9d748e7edb0db90" value="(var &quot;P&quot; `implies` var &quot;Q&quot;) `iff` true" /><br /><div class="answer" id="resbb714c0b09ca2a91e9d748e7edb0db90"><code class="result">LOr (LNot (LVar &quot;P&quot;)) (LVar &quot;Q&quot;)</code><code> :: </code><code class="type">LExpr</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','967101c42e8d2b92ea2d2e79819eb654','967101c42e8d2b92ea2d2e79819eb654');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea967101c42e8d2b92ea2d2e79819eb654" value="true `lor` (var &quot;P&quot; `iff` var &quot;Q&quot;)" /><br /><div class="answer" id="res967101c42e8d2b92ea2d2e79819eb654"><code class="result">LLit True</code><code> :: </code><code class="type">LExpr</code></div></form>
</section>
<section id="exercise-24" class="level2">
<h2>Exercise</h2>
<p>Define a function for translating the <code>LExpr</code> expressions to strings that are formatted as C expressions. See the test cases for the exact rules on formatting.</p>
<div class="sourceCode" id="cb55"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb55-1" data-line-number="1"><span class="ot">render ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">String</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_d7cb24516119ded73ffce4df2fb149c6.hs','d7cb24516119ded73ffce4df2fb149c6','d7cb24516119ded73ffce4df2fb149c6');"><textarea cols="80" rows="15" id="taread7cb24516119ded73ffce4df2fb149c6"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resd7cb24516119ded73ffce4df2fb149c6"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','aaa148ee6c3c1dd1bab6cf79a13a6581','aaa148ee6c3c1dd1bab6cf79a13a6581');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaaa148ee6c3c1dd1bab6cf79a13a6581" value="render (var &quot;P&quot; `implies` var &quot;Q&quot;)" /><br /><div class="answer" id="resaaa148ee6c3c1dd1bab6cf79a13a6581"><code class="result">&quot;(!(P)) || (Q)&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','349ea7a087c9b5de9aec9952c6d5f389','349ea7a087c9b5de9aec9952c6d5f389');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea349ea7a087c9b5de9aec9952c6d5f389" value="render (lnot true)" /><br /><div class="answer" id="res349ea7a087c9b5de9aec9952c6d5f389"><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_ADT_en.hs','cd28f9b3e04337c75d3bc68d8d6a6966','cd28f9b3e04337c75d3bc68d8d6a6966');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacd28f9b3e04337c75d3bc68d8d6a6966" value="render ((var &quot;A&quot; `lor` var &quot;B&quot;) `implies` var &quot;C&quot;)" /><br /><div class="answer" id="rescd28f9b3e04337c75d3bc68d8d6a6966"><code class="result">&quot;(!((A) || (B))) || (C)&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','3b900912c05fb159a7d9da4bd71e4257','3b900912c05fb159a7d9da4bd71e4257');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3b900912c05fb159a7d9da4bd71e4257" value="render (false `lor` (var &quot;X&quot; `land` true))" /><br /><div class="answer" id="res3b900912c05fb159a7d9da4bd71e4257"><code class="result">&quot;X&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','f10547e3bf2e44174d6764952a129293','f10547e3bf2e44174d6764952a129293');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf10547e3bf2e44174d6764952a129293" value="render ((var &quot;P&quot; `implies` var &quot;Q&quot;) `iff` true)" /><br /><div class="answer" id="resf10547e3bf2e44174d6764952a129293"><code class="result">&quot;(!(P)) || (Q)&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','432b7f91ddf125057103836bd17229c4','432b7f91ddf125057103836bd17229c4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea432b7f91ddf125057103836bd17229c4" value="render (true `lor` (var &quot;P&quot; `iff` var &quot;Q&quot;))" /><br /><div class="answer" id="res432b7f91ddf125057103836bd17229c4"><code class="result">&quot;1&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-25" class="level2">
<h2>Exercise</h2>
<p>Define a function that finds all the variables in an <code>LExpr</code> expression. In case of no variables, an empty list shall be returned.</p>
<div class="sourceCode" id="cb56"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb56-1" data-line-number="1"><span class="ot">vars ::</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> [<span class="dt">String</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_33d0517837f5ab4c78512bf51f9cd913.hs','33d0517837f5ab4c78512bf51f9cd913','33d0517837f5ab4c78512bf51f9cd913');"><textarea cols="80" rows="7" id="tarea33d0517837f5ab4c78512bf51f9cd913"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res33d0517837f5ab4c78512bf51f9cd913"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','2a632575a4e351d6b741a6a899533c2f','2a632575a4e351d6b741a6a899533c2f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a632575a4e351d6b741a6a899533c2f" value="vars true" /><br /><div class="answer" id="res2a632575a4e351d6b741a6a899533c2f"><code class="result">[]</code><code> :: </code><code class="type">[String]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','336817f72c60308e942126f5d3ca7a41','336817f72c60308e942126f5d3ca7a41');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea336817f72c60308e942126f5d3ca7a41" value="vars (var &quot;X&quot;)" /><br /><div class="answer" id="res336817f72c60308e942126f5d3ca7a41"><code class="result">[&quot;X&quot;]</code><code> :: </code><code class="type">[String]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','e3f5c65f9b60837a7d89358ea5e9a6a9','e3f5c65f9b60837a7d89358ea5e9a6a9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae3f5c65f9b60837a7d89358ea5e9a6a9" value="vars (var &quot;P&quot; `implies` var &quot;Q&quot;)" /><br /><div class="answer" id="rese3f5c65f9b60837a7d89358ea5e9a6a9"><code class="result">[&quot;P&quot;, &quot;Q&quot;]</code><code> :: </code><code class="type">[String]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','fabb6a5fb5e2d7e9d3727eca1bd920a2','fabb6a5fb5e2d7e9d3727eca1bd920a2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafabb6a5fb5e2d7e9d3727eca1bd920a2" value="vars ((var &quot;A&quot; `lor` var &quot;B&quot;) `implies` var &quot;C&quot;)" /><br /><div class="answer" id="resfabb6a5fb5e2d7e9d3727eca1bd920a2"><code class="result">[&quot;A&quot;, &quot;B&quot;, &quot;C&quot;]</code><code> :: </code><code class="type">[String]</code></div></form>
</section>
<section id="exercise-26" class="level2">
<h2>Exercise</h2>
<p>Define a function that translates an <code>LExpr</code> expression to a C-language function that computes the value of the expression. In addition to the abstract to translate, the name of the function to generate is given. Check the test cases for the exact formatting, although it follows the standard rules of the C language.</p>
<div class="sourceCode" id="cb57"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb57-1" data-line-number="1"><span class="ot">compile ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">LExpr</span> <span class="ot">-&gt;</span> <span class="dt">String</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_dcf5bc24f12f96fe0f1e0bb80715d7a0.hs','dcf5bc24f12f96fe0f1e0bb80715d7a0','dcf5bc24f12f96fe0f1e0bb80715d7a0');"><textarea cols="80" rows="12" id="tareadcf5bc24f12f96fe0f1e0bb80715d7a0"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resdcf5bc24f12f96fe0f1e0bb80715d7a0"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','f851b9a99c70c6aa057fa979664f6776','f851b9a99c70c6aa057fa979664f6776');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf851b9a99c70c6aa057fa979664f6776" value="compile &quot;f&quot; $ (var &quot;p&quot; `implies` var &quot;q&quot;) `iff` true" /><br /><div class="answer" id="resf851b9a99c70c6aa057fa979664f6776"><code class="result">&quot;char f(char p, char q){\n  return (!(p)) || (q);\n}\n&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9d8926bf2b8b07072f54b06f53829603','9d8926bf2b8b07072f54b06f53829603');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9d8926bf2b8b07072f54b06f53829603" value="compile &quot;f&quot; $ true `lor` (var &quot;P&quot; `iff` var &quot;Q&quot;)" /><br /><div class="answer" id="res9d8926bf2b8b07072f54b06f53829603"><code class="result">&quot;char f(){\n  return 1;\n}\n&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-27" class="level2">
<h2>Exercise</h2>
<p>Define a data structure, called <code>Heap</code> that has the property that the least element could be always retrieved immediately. The elements could be of arbitrary type, the only restriction is that they shall implement an ordering (that is, member of the <code>Ord</code> type class).</p>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_a50a5fd2596c2f6a1360e53517cc7bf9.hs','a50a5fd2596c2f6a1360e53517cc7bf9','a50a5fd2596c2f6a1360e53517cc7bf9');"><textarea cols="80" rows="4" id="tareaa50a5fd2596c2f6a1360e53517cc7bf9"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resa50a5fd2596c2f6a1360e53517cc7bf9"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','3642c40b15e369b958d8adebba66d855','3642c40b15e369b958d8adebba66d855');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3642c40b15e369b958d8adebba66d855" value="E" /><br /><div class="answer" id="res3642c40b15e369b958d8adebba66d855"><code class="result">E</code><code> :: </code><code class="type">Heap ()</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','70d6edd2731b918fde702fc24291e30c','70d6edd2731b918fde702fc24291e30c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea70d6edd2731b918fde702fc24291e30c" value="F 0 'a' E E" /><br /><div class="answer" id="res70d6edd2731b918fde702fc24291e30c"><code class="result">F 0 'a' E E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<p>It has two constructors:</p>
<ul>
<li><code>E</code>, an empty heap.</li>
</ul>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','891d5a9f34cbed632ae2f452ef8a3d1e','891d5a9f34cbed632ae2f452ef8a3d1e');"><div class="answer" id="res891d5a9f34cbed632ae2f452ef8a3d1e"><code class="result">E</code><code> :: </code><code class="type">Heap a</code></div></form>
<ul>
<li><code>F</code>, a non-empty heap that contains the rank of the heap (as an integer), the least element and two subheaps that both contain elements that are greater than the element in the root.</li>
</ul>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','76982e488cbdcae52201b345c7b232d5','76982e488cbdcae52201b345c7b232d5');"><div class="answer" id="res76982e488cbdcae52201b345c7b232d5"><code class="result">F</code><code> :: </code><code class="type">Int -&gt; a -&gt; Heap a -&gt; Heap a -&gt; Heap a</code></div></form>
<p>All heaps satisfy the condition that the rank of any successor on the left is at least the same as the rank of the successor on right at the same level.</p>
</section>
<section id="exercise-28" class="level2">
<h2>Exercise</h2>
<p>Ranks are determined by the length of the path from the root to the rightmost element in the heap. Note that is information is continuously maintained in data structure itself, so it enough to extract it from there.</p>
<div class="sourceCode" id="cb58"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb58-1" data-line-number="1"><span class="ot">rank ::</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Int</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_badc0a531f3e7029ebd3fa8c5801f056.hs','badc0a531f3e7029ebd3fa8c5801f056','badc0a531f3e7029ebd3fa8c5801f056');"><textarea cols="80" rows="4" id="tareabadc0a531f3e7029ebd3fa8c5801f056"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resbadc0a531f3e7029ebd3fa8c5801f056"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','a122a3c4d2f57903a0f0a446d99a6db7','a122a3c4d2f57903a0f0a446d99a6db7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa122a3c4d2f57903a0f0a446d99a6db7" value="rank E" /><br /><div class="answer" id="resa122a3c4d2f57903a0f0a446d99a6db7"><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_ADT_en.hs','cb0e10f161a28bcdf88b64b600b4d4f0','cb0e10f161a28bcdf88b64b600b4d4f0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacb0e10f161a28bcdf88b64b600b4d4f0" value="rank (F 1 42 E E)" /><br /><div class="answer" id="rescb0e10f161a28bcdf88b64b600b4d4f0"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-29" class="level2">
<h2>Exercise</h2>
<p>Define a helper function that computes the rank for each of the nodes and optionally swap the order of the successors if they would violate the previously described structural invariant.</p>
<div class="sourceCode" id="cb59"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb59-1" data-line-number="1"><span class="ot">mkF ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_e4639a54ba3bb688e7fefa8073fc2064.hs','e4639a54ba3bb688e7fefa8073fc2064','e4639a54ba3bb688e7fefa8073fc2064');"><textarea cols="80" rows="5" id="tareae4639a54ba3bb688e7fefa8073fc2064"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese4639a54ba3bb688e7fefa8073fc2064"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','cd2b65931330a020084e061172666701','cd2b65931330a020084e061172666701');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacd2b65931330a020084e061172666701" value="mkF 'x' E E" /><br /><div class="answer" id="rescd2b65931330a020084e061172666701"><code class="result">F 1 'x' E E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','db641df2afad476c45540a60434c2caf','db641df2afad476c45540a60434c2caf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadb641df2afad476c45540a60434c2caf" value="mkF 'f' (mkF 'o' (mkF 'b' (mkF 'a' E E) E) E) E" /><br /><div class="answer" id="resdb641df2afad476c45540a60434c2caf"><code class="result">F 1 'f' (F 1 'o' (F 1 'b' (F 1 'a' E E) E) E) E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','b30ceda9fc6191e002fd71caa80f99f9','b30ceda9fc6191e002fd71caa80f99f9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab30ceda9fc6191e002fd71caa80f99f9" value="mkF &quot;apple&quot; (mkF &quot;pear&quot; E (mkF &quot;peach&quot; E (mkF &quot;plum&quot; E E))) E" /><br /><div class="answer" id="resb30ceda9fc6191e002fd71caa80f99f9"><code class="result">F 1 &quot;apple&quot; (F 1 &quot;pear&quot; (F 1 &quot;peach&quot; (F 1 &quot;plum&quot; E E) E) E) E</code><code> :: </code><code class="type">Heap [Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','e116ca03af492ea7752956fd2ed0bea0','e116ca03af492ea7752956fd2ed0bea0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae116ca03af492ea7752956fd2ed0bea0" value="mkF 'z' (mkF 'x' (mkF 'y' E E) (mkF 'u' E E)) (mkF 'w' (mkF 'a' E E) (mkF 'b' E (mkF 'c' E E)))" /><br /><div class="answer" id="rese116ca03af492ea7752956fd2ed0bea0"><code class="result">F 3 'z' (F 2 'x' (F 1 'y' E E) (F 1 'u' E E))
  (F 2 'w' (F 1 'a' E E) (F 1 'b' (F 1 'c' E E) E))</code><code> :: </code><code class="type">Heap Char</code></div></form>
</section>
<section id="exercise-30" class="level2">
<h2>Exercise</h2>
<p>Define a constant for the empty heap that does not contain any elements.</p>
<div class="sourceCode" id="cb60"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb60-1" data-line-number="1"><span class="ot">empty ::</span> <span class="dt">Heap</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_e38b11b3e88943ca93e74a91e03eba10.hs','e38b11b3e88943ca93e74a91e03eba10','e38b11b3e88943ca93e74a91e03eba10');"><textarea cols="80" rows="3" id="tareae38b11b3e88943ca93e74a91e03eba10"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese38b11b3e88943ca93e74a91e03eba10"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','def46fd1733a7bcff7a92e5e26243ac6','def46fd1733a7bcff7a92e5e26243ac6');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadef46fd1733a7bcff7a92e5e26243ac6" value="rank empty" /><br /><div class="answer" id="resdef46fd1733a7bcff7a92e5e26243ac6"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-31" class="level2">
<h2>Exercise</h2>
<p>Define a function for building singleton heaps.</p>
<div class="sourceCode" id="cb61"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb61-1" data-line-number="1"><span class="ot">singleton ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_5f4f33609c2b4079623f71d8acd812f6.hs','5f4f33609c2b4079623f71d8acd812f6','5f4f33609c2b4079623f71d8acd812f6');"><textarea cols="80" rows="3" id="tarea5f4f33609c2b4079623f71d8acd812f6"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res5f4f33609c2b4079623f71d8acd812f6"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','4d20991379fe6971ff36e004e1766f66','4d20991379fe6971ff36e004e1766f66');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4d20991379fe6971ff36e004e1766f66" value="rank (singleton True)" /><br /><div class="answer" id="res4d20991379fe6971ff36e004e1766f66"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-32" class="level2">
<h2>Exercise</h2>
<p>Define a function to test if a heap is empty or not.</p>
<div class="sourceCode" id="cb62"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb62-1" data-line-number="1"><span class="ot">isEmpty ::</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_9afcc16dee222b4187428c7c029ff91c.hs','9afcc16dee222b4187428c7c029ff91c','9afcc16dee222b4187428c7c029ff91c');"><textarea cols="80" rows="4" id="tarea9afcc16dee222b4187428c7c029ff91c"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res9afcc16dee222b4187428c7c029ff91c"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','dcb6ca5c89487b7b220dbd1b3b106930','dcb6ca5c89487b7b220dbd1b3b106930');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadcb6ca5c89487b7b220dbd1b3b106930" value="isEmpty empty" /><br /><div class="answer" id="resdcb6ca5c89487b7b220dbd1b3b106930"><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_ADT_en.hs','f43c6350ddb9ede068ff1faf451ad407','f43c6350ddb9ede068ff1faf451ad407');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf43c6350ddb9ede068ff1faf451ad407" value="not (isEmpty (singleton 'a'))" /><br /><div class="answer" id="resf43c6350ddb9ede068ff1faf451ad407"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-33" class="level2">
<h2>Exercise</h2>
<p>Define a function for finding the least element of a heap. Note that there is no such element for empty heaps.</p>
<div class="sourceCode" id="cb63"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb63-1" data-line-number="1"><span class="ot">findMin ::</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Maybe</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_5c9301e9e46345a7762bb05f3a064e46.hs','5c9301e9e46345a7762bb05f3a064e46','5c9301e9e46345a7762bb05f3a064e46');"><textarea cols="80" rows="4" id="tarea5c9301e9e46345a7762bb05f3a064e46"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res5c9301e9e46345a7762bb05f3a064e46"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','713ee28c33c29d73205b3eb05ebe43fd','713ee28c33c29d73205b3eb05ebe43fd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea713ee28c33c29d73205b3eb05ebe43fd" value="findMin empty" /><br /><div class="answer" id="res713ee28c33c29d73205b3eb05ebe43fd"><code class="result">Nothing</code><code> :: </code><code class="type">Maybe ()</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','5c0c918557726458a814b4c7ba2ff720','5c0c918557726458a814b4c7ba2ff720');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5c0c918557726458a814b4c7ba2ff720" value="findMin (singleton &quot;foobar&quot;)" /><br /><div class="answer" id="res5c0c918557726458a814b4c7ba2ff720"><code class="result">Just &quot;foobar&quot;</code><code> :: </code><code class="type">Maybe [Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','dbef23c40cdae5682afe330059e34209','dbef23c40cdae5682afe330059e34209');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadbef23c40cdae5682afe330059e34209" value="findMin (mkF 'a' (singleton 'b') (singleton 'c'))" /><br /><div class="answer" id="resdbef23c40cdae5682afe330059e34209"><code class="result">Just 'a'</code><code> :: </code><code class="type">Maybe Char</code></div></form>
</section>
<section id="exercise-34" class="level2">
<h2>Exercise</h2>
<p>Define a function for merging two heaps, which happens in the same way as they were ordered lists. The only difference is that the left and right successors might be swapped during the merge in order to maintain the structural invariant of the data structure (so use the <code>mkF</code> function).</p>
<div class="sourceCode" id="cb64"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb64-1" data-line-number="1"><span class="ot">merge ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_8354e1174299d538f99223ee0c3cb85f.hs','8354e1174299d538f99223ee0c3cb85f','8354e1174299d538f99223ee0c3cb85f');"><textarea cols="80" rows="7" id="tarea8354e1174299d538f99223ee0c3cb85f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res8354e1174299d538f99223ee0c3cb85f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','9eb652852ff6f718e69e31b844677854','9eb652852ff6f718e69e31b844677854');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9eb652852ff6f718e69e31b844677854" value="merge empty empty" /><br /><div class="answer" id="res9eb652852ff6f718e69e31b844677854"><code class="result">E</code><code> :: </code><code class="type">Heap ()</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','f3ec569cd84d2e4742c1e2d3d62ebfe9','f3ec569cd84d2e4742c1e2d3d62ebfe9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf3ec569cd84d2e4742c1e2d3d62ebfe9" value="merge empty (singleton 'x')" /><br /><div class="answer" id="resf3ec569cd84d2e4742c1e2d3d62ebfe9"><code class="result">F 1 'x' E E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','422bb52dcee4e7f60dbf366b646e9860','422bb52dcee4e7f60dbf366b646e9860');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea422bb52dcee4e7f60dbf366b646e9860" value="merge (singleton 'z') (singleton 'x')" /><br /><div class="answer" id="res422bb52dcee4e7f60dbf366b646e9860"><code class="result">F 1 'x' (F 1 'z' E E) E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','c1e45762d868d247ccda217d7cb339c0','c1e45762d868d247ccda217d7cb339c0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac1e45762d868d247ccda217d7cb339c0" value="merge (singleton 'u') (merge (singleton 'z') (singleton 'x'))" /><br /><div class="answer" id="resc1e45762d868d247ccda217d7cb339c0"><code class="result">F 1 'u' (F 1 'x' (F 1 'z' E E) E) E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','59760d45e916615332f0663f90426f71','59760d45e916615332f0663f90426f71');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea59760d45e916615332f0663f90426f71" value="merge (merge (singleton 'u') (merge (singleton 'z') (singleton 'x'))) (singleton 'w')" /><br /><div class="answer" id="res59760d45e916615332f0663f90426f71"><code class="result">F 2 'u' (F 1 'x' (F 1 'z' E E) E) (F 1 'w' E E)</code><code> :: </code><code class="type">Heap Char</code></div></form>
</section>
<section id="exercise-35" class="level2">
<h2>Exercise</h2>
<p>Define insertion for heaps with the help of merging: merge the heap with a singleton heap that contains the new element.</p>
<div class="sourceCode" id="cb65"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb65-1" data-line-number="1"><span class="ot">insert ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Heap</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_e1d8fbbc2de96bcd60c0451ab86ae2d3.hs','e1d8fbbc2de96bcd60c0451ab86ae2d3','e1d8fbbc2de96bcd60c0451ab86ae2d3');"><textarea cols="80" rows="3" id="tareae1d8fbbc2de96bcd60c0451ab86ae2d3"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese1d8fbbc2de96bcd60c0451ab86ae2d3"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','b36260a92f4df282ec53f4fae8940454','b36260a92f4df282ec53f4fae8940454');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab36260a92f4df282ec53f4fae8940454" value="insert 'x' empty" /><br /><div class="answer" id="resb36260a92f4df282ec53f4fae8940454"><code class="result">F 1 'x' E E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','f40a53d5c884376b0d35f130d3b502cd','f40a53d5c884376b0d35f130d3b502cd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf40a53d5c884376b0d35f130d3b502cd" value="insert 'm' (insert 'x' empty)" /><br /><div class="answer" id="resf40a53d5c884376b0d35f130d3b502cd"><code class="result">F 1 'm' (F 1 'x' E E) E</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','8ea7ad530bb8f291d715575b04f81b83','8ea7ad530bb8f291d715575b04f81b83');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8ea7ad530bb8f291d715575b04f81b83" value="insert 'p' (insert 'm' (insert 'x' empty))" /><br /><div class="answer" id="res8ea7ad530bb8f291d715575b04f81b83"><code class="result">F 2 'm' (F 1 'x' E E) (F 1 'p' E E)</code><code> :: </code><code class="type">Heap Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','e92ca63a2e59fc7c23c3afe07f35e18e','e92ca63a2e59fc7c23c3afe07f35e18e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae92ca63a2e59fc7c23c3afe07f35e18e" value="insert 'h' (insert 'p' (insert 'm' (insert 'x' empty)))" /><br /><div class="answer" id="rese92ca63a2e59fc7c23c3afe07f35e18e"><code class="result">F 1 'h' (F 2 'm' (F 1 'x' E E) (F 1 'p' E E)) E</code><code> :: </code><code class="type">Heap Char</code></div></form>
</section>
<section id="exercise-36" class="level2">
<h2>Exercise</h2>
<p>Define deletion of the least element with the help of merging: extract the least element then merge the left and right subheaps (if there are any).</p>
<div class="sourceCode" id="cb66"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb66-1" data-line-number="1"><span class="ot">deleteMin ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> <span class="dt">Heap</span> a <span class="ot">-&gt;</span> <span class="dt">Maybe</span> (<span class="dt">Heap</span> a)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_ADT_en_d4bf50bb4e5f4a8452f2df8f1e86233e.hs','d4bf50bb4e5f4a8452f2df8f1e86233e','d4bf50bb4e5f4a8452f2df8f1e86233e');"><textarea cols="80" rows="4" id="taread4bf50bb4e5f4a8452f2df8f1e86233e"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resd4bf50bb4e5f4a8452f2df8f1e86233e"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','cbc494ad5fbcd833b6f4c1ae930fff86','cbc494ad5fbcd833b6f4c1ae930fff86');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacbc494ad5fbcd833b6f4c1ae930fff86" value="deleteMin empty" /><br /><div class="answer" id="rescbc494ad5fbcd833b6f4c1ae930fff86"><code class="result">Nothing</code><code> :: </code><code class="type">Maybe (Heap ())</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','c7d49c1be104438a404c95d4af4bf23d','c7d49c1be104438a404c95d4af4bf23d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac7d49c1be104438a404c95d4af4bf23d" value="deleteMin (singleton &quot;heap&quot;)" /><br /><div class="answer" id="resc7d49c1be104438a404c95d4af4bf23d"><code class="result">Just E</code><code> :: </code><code class="type">Maybe (Heap [Char])</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','591f91b499ef25ad88484394d03e331d','591f91b499ef25ad88484394d03e331d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea591f91b499ef25ad88484394d03e331d" value="deleteMin (insert 'm' (singleton 'x'))" /><br /><div class="answer" id="res591f91b499ef25ad88484394d03e331d"><code class="result">Just (F 1 'x' E E)</code><code> :: </code><code class="type">Maybe (Heap Char)</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_ADT_en.hs','0dca1813c204b299c7edf9fc5653a520','0dca1813c204b299c7edf9fc5653a520');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0dca1813c204b299c7edf9fc5653a520" value="deleteMin (insert 'x' (singleton 'm'))" /><br /><div class="answer" id="res0dca1813c204b299c7edf9fc5653a520"><code class="result">Just (F 1 'x' E E)</code><code> :: </code><code class="type">Maybe (Heap Char)</code></div></form>
</section>
</section>
</body>
</html>

