<?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>Pattern Matching</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">Pattern Matching</h1>
<div id="info"></div>
<ul>
<li><a href="#pattern-matching">Pattern Matching</a></li>
<li><a href="#types-of-patterns">Types of Patterns</a></li>
<li><a href="#incomplete-patterns">Incomplete Patterns</a></li>
<li><a href="#prelude."><code>Prelude.&amp;&amp;</code></a></li>
<li><a href="#exercise-prelude.">Exercise: <code>(Prelude.||)</code> [*]</a></li>
<li><a href="#exercise-exclusive-or">Exercise: Exclusive OR</a></li>
<li><a href="#patterns-for-pairs-prelude.fst">Patterns for Pairs: <code>Prelude.fst</code></a></li>
<li><a href="#exercise-swapping-elements">Exercise: Swapping Elements [*]</a></li>
<li><a href="#exercise-reflection-in-the-x-axis">Exercise: Reflection in the X Axis</a></li>
<li><a href="#exercise-scaling-in-the-origin">Exercise: Scaling in the Origin</a></li>
<li><a href="#exercise-point-reflection">Exercise: Point Reflection</a></li>
<li><a href="#exercise-distance">Exercise: Distance [*]</a></li>
<li><a href="#patterns-for-numbers-characters-and-strings">Patterns for Numbers, Characters, and Strings</a></li>
<li><a href="#exercise-modulo-3-multiplication">Exercise: Modulo 3 Multiplication [*]</a></li>
<li><a href="#exercise-replace-line-break-with-space">Exercise: Replace Line Break with Space</a></li>
<li><a href="#exercise-replace-all-line-breaks-with-spaces">Exercise: Replace All Line Breaks with Spaces</a></li>
<li><a href="#exercise-swap-this-and-that">Exercise: Swap “this” and “that” [*]</a></li>
<li><a href="#exercise-swap-all-this-and-that">Exercise: Swap All “this” and “that” [*]</a></li>
<li><a href="#patterns-for-lists">Patterns for Lists</a></li>
<li><a href="#exercise-is-a-singleton-list">Exercise: Is A Singleton List? [*]</a></li>
<li><a href="#exercise-capitalize-initial-letter">Exercise: Capitalize Initial Letter [*]</a></li>
<li><a href="#exercise-capitalize-all-initial-letters">Exercise: Capitalize All Initial Letters</a></li>
<li><a href="#patterns-in-list-comprehensions">Patterns in List Comprehensions</a></li>
<li><a href="#exercise-identical-words-in-a-text">Exercise: Identical Words in a Text</a></li>
<li><a href="#exercise-filter-by-distance-of-elements">Exercise: Filter by Distance of Elements</a></li>
<li><a href="#exercise-every-fifth-element-of-a-list">Exercise: Every Fifth Element of a List</a></li>
</ul>
</div>
<section id="pattern-matching" class="level1">
<h1>Pattern Matching</h1>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" data-line-number="1">not<span class="ot"> ::</span> <span class="dt">Bool</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb1-2" data-line-number="2">not <span class="dt">True</span>  <span class="fu">=</span> <span class="dt">False</span></a>
<a class="sourceLine" id="cb1-3" data-line-number="3">not <span class="dt">False</span> <span class="fu">=</span> <span class="dt">True</span></a></code></pre></div>
<p>Notice that the <code>not</code> function has two <em>rules</em>:</p>
<ul>
<li>The first rule says that if the parameter is <code>True</code>, then the function returns <code>False</code>.</li>
<li>The second rule says that if the parameter is <code>False</code>, then the function returns <code>True</code>.</li>
</ul>
<p>When you run a function, only one rule can run. Haskell runs the first matching rule.</p>
<ul>
<li>Function parameters are not variables but patterns.</li>
<li>One pattern may match an expression.</li>
<li>The first matching alternative is selected at evaluation.</li>
</ul>
</section>
<section id="types-of-patterns" class="level1">
<h1>Types of Patterns</h1>
<p>A pattern may be:</p>
<ul>
<li>a variable: <code>x</code>, <code>xs</code>, <code>y</code>, <code>a</code>, <code>foobar</code>… These names match any value, and can be used in the rule’s body.</li>
<li>a wildcard: <code>_</code> This symbol matches any value, and <em>cannot</em> be used in the rule’s body. It is a “don’t care” value.</li>
<li>a type-specific pattern: <code>True</code>, <code>0</code>, <code>(a, b)</code>, <code>&quot;hello&quot;</code>… Only values matching the given pattern are accepted.</li>
</ul>
</section>
<section id="incomplete-patterns" class="level1">
<h1>Incomplete Patterns</h1>
<p>Usually, a function should match all possible values. For example, in the <code>not</code> function above, the possible values are <code>True</code> and <code>False</code>, and we have a rule for both. What happens if call the function with a value for which there is no rule?</p>
<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="ot">addOne ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb2-2" data-line-number="2">addOne <span class="dv">0</span> <span class="fu">=</span> <span class="dv">1</span></a>
<a class="sourceLine" id="cb2-3" data-line-number="3">addOne <span class="dv">1</span> <span class="fu">=</span> <span class="dv">2</span></a>
<a class="sourceLine" id="cb2-4" data-line-number="4">addOne <span class="dv">2</span> <span class="fu">=</span> <span class="dv">3</span></a></code></pre></div>
<p>Try calling <code>addOne</code> with the parameter <code>5</code>.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','44dfad7e1fddd373bf29b9a7e9af605f','44dfad7e1fddd373bf29b9a7e9af605f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea44dfad7e1fddd373bf29b9a7e9af605f" value="addOne 2" /><br /><div class="answer" id="res44dfad7e1fddd373bf29b9a7e9af605f"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
<p>How can we fix the above function?</p>
</section>
<section id="prelude." class="level1">
<h1><code>Prelude.&amp;&amp;</code></h1>
<p>Here is a possible definition of the logical AND operation:</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="ot">(&amp;&amp;) ::</span> <span class="dt">Bool</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="dt">True</span>  <span class="fu">&amp;&amp;</span> <span class="dt">True</span>  <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb3-3" data-line-number="3"><span class="dt">True</span>  <span class="fu">&amp;&amp;</span> <span class="dt">False</span> <span class="fu">=</span> <span class="dt">False</span></a>
<a class="sourceLine" id="cb3-4" data-line-number="4"><span class="dt">False</span> <span class="fu">&amp;&amp;</span> <span class="dt">True</span>  <span class="fu">=</span> <span class="dt">False</span></a>
<a class="sourceLine" id="cb3-5" data-line-number="5"><span class="dt">False</span> <span class="fu">&amp;&amp;</span> <span class="dt">False</span> <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<div class="handout">
<hr />
<p>Logical AND implemented in a different way:</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="co">-- True  &amp;&amp; True  = True</span></a>
<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="co">-- _     &amp;&amp; _     = False</span></a></code></pre></div>
<p>Logical AND implemented in yet another different way:</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="co">-- True  &amp;&amp; x     = x</span></a>
<a class="sourceLine" id="cb5-2" data-line-number="2"><span class="co">-- _     &amp;&amp; _     = False</span></a></code></pre></div>
</div>
</section>
<section id="exercise-prelude." class="level1">
<h1>Exercise: <code>(Prelude.||)</code> [*]</h1>
<p>Redefine the <code>(||)</code> operator.</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="ot">(||) ::</span> <span class="dt">Bool</span> <span class="ot">-&gt;</span> <span class="dt">Bool</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=Patterns_en_658b37e322036e00d4e1c6625dba7481.hs','658b37e322036e00d4e1c6625dba7481','658b37e322036e00d4e1c6625dba7481');"><textarea cols="80" rows="4" id="tarea658b37e322036e00d4e1c6625dba7481"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res658b37e322036e00d4e1c6625dba7481"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','9508cdf4f3c9cb52512c0ed387901518','9508cdf4f3c9cb52512c0ed387901518');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9508cdf4f3c9cb52512c0ed387901518" value="True  || True " /><br /><div class="answer" id="res9508cdf4f3c9cb52512c0ed387901518"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','7ec299edff4167d69107685043eedb1c','7ec299edff4167d69107685043eedb1c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7ec299edff4167d69107685043eedb1c" value="False || True " /><br /><div class="answer" id="res7ec299edff4167d69107685043eedb1c"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<div class="handout">
<hr />
<p>Here, we will have to hide the original definition of <code>(||)</code>.</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="co">-- import Prelude hiding ((||), ...)</span></a></code></pre></div>
<p>In place of the dots, there may be further definitions to hide.</p>
</div>
</section>
<section id="exercise-exclusive-or" class="level1">
<h1>Exercise: Exclusive OR</h1>
<p>Define the exclusive OR function.</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="ot">xor ::</span> <span class="dt">Bool</span> <span class="ot">-&gt;</span> <span class="dt">Bool</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=Patterns_en_265e0ca75b6786a55b68900dc55ce5e4.hs','265e0ca75b6786a55b68900dc55ce5e4','265e0ca75b6786a55b68900dc55ce5e4');"><textarea cols="80" rows="3" id="tarea265e0ca75b6786a55b68900dc55ce5e4"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res265e0ca75b6786a55b68900dc55ce5e4"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','b43ba4928d6a7ea834c37504a48d73ff','b43ba4928d6a7ea834c37504a48d73ff');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab43ba4928d6a7ea834c37504a48d73ff" value="True  `xor` True " /><br /><div class="answer" id="resb43ba4928d6a7ea834c37504a48d73ff"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','3cca704ade9aa1e9bd4daadce0517caa','3cca704ade9aa1e9bd4daadce0517caa');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3cca704ade9aa1e9bd4daadce0517caa" value="False `xor` True " /><br /><div class="answer" id="res3cca704ade9aa1e9bd4daadce0517caa"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','8185b9ec55b1414da0ca1272b402514b','8185b9ec55b1414da0ca1272b402514b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8185b9ec55b1414da0ca1272b402514b" value="True  `xor` False" /><br /><div class="answer" id="res8185b9ec55b1414da0ca1272b402514b"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','0fa20d960cb9a59f15f4c3d31ecfb67c','0fa20d960cb9a59f15f4c3d31ecfb67c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0fa20d960cb9a59f15f4c3d31ecfb67c" value="False `xor` False" /><br /><div class="answer" id="res0fa20d960cb9a59f15f4c3d31ecfb67c"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="patterns-for-pairs-prelude.fst" class="level1">
<h1>Patterns for Pairs: <code>Prelude.fst</code></h1>
<p>Pattern for matching pairs: <code>(</code>x<code>,</code> y<code>)</code>.</p>
<p>For example:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb9-1" data-line-number="1">fst (a, b) <span class="fu">=</span> a</a>
<a class="sourceLine" id="cb9-2" data-line-number="2">snd (a, b) <span class="fu">=</span> b</a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','86be28b40d525cb9e9d3b46ed4577313','86be28b40d525cb9e9d3b46ed4577313');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea86be28b40d525cb9e9d3b46ed4577313" value="snd (&quot;hello&quot;, 2)" /><br /><div class="answer" id="res86be28b40d525cb9e9d3b46ed4577313"><code class="result">2</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-swapping-elements" class="level1">
<h1>Exercise: Swapping Elements [*]</h1>
<p>Swap two elements of a pair. Use pattern matching on a tuple.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="ot">swap ::</span> (a, b) <span class="ot">-&gt;</span> (b, a)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_9934cd96b831e986f435ecd5ecf40af6.hs','9934cd96b831e986f435ecd5ecf40af6','9934cd96b831e986f435ecd5ecf40af6');"><textarea cols="80" rows="3" id="tarea9934cd96b831e986f435ecd5ecf40af6"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res9934cd96b831e986f435ecd5ecf40af6"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','bf5ca7ea56e677bfc0516c37929916de','bf5ca7ea56e677bfc0516c37929916de');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareabf5ca7ea56e677bfc0516c37929916de" value="swap (3, &quot;hi&quot;)" /><br /><div class="answer" id="resbf5ca7ea56e677bfc0516c37929916de"><code class="result">(&quot;hi&quot;, 3)</code><code> :: </code><code class="type">([Char], Integer)</code></div></form>
</section>
<section id="exercise-reflection-in-the-x-axis" class="level1">
<h1>Exercise: Reflection in the X Axis</h1>
<p>Reflect a point in the X axis.</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">reflectX ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> (a, a) <span class="ot">-&gt;</span> (a, a)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_ed6cab64877b28fd6eba37b8a403985d.hs','ed6cab64877b28fd6eba37b8a403985d','ed6cab64877b28fd6eba37b8a403985d');"><textarea cols="80" rows="3" id="tareaed6cab64877b28fd6eba37b8a403985d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resed6cab64877b28fd6eba37b8a403985d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','ae8d292c9ae310dec00c436a6f3c2e69','ae8d292c9ae310dec00c436a6f3c2e69');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaae8d292c9ae310dec00c436a6f3c2e69" value="reflectX (3, 4)" /><br /><div class="answer" id="resae8d292c9ae310dec00c436a6f3c2e69"><code class="result">(3, -4)</code><code> :: </code><code class="type">(Integer, Integer)</code></div></form>
</section>
<section id="exercise-scaling-in-the-origin" class="level1">
<h1>Exercise: Scaling in the Origin</h1>
<p>Let <code>scale' t</code> be a scaling by <code>t</code> in the origin. The magnitude of the point will increase by the given value.</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">scale&#39; ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> (a, a) <span class="ot">-&gt;</span> (a, a)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_c5d31fc292a267623da457a027b191d5.hs','c5d31fc292a267623da457a027b191d5','c5d31fc292a267623da457a027b191d5');"><textarea cols="80" rows="3" id="tareac5d31fc292a267623da457a027b191d5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resc5d31fc292a267623da457a027b191d5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','8dad5810df65e3d5dd6f65bf9d21381d','8dad5810df65e3d5dd6f65bf9d21381d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8dad5810df65e3d5dd6f65bf9d21381d" value="scale' 5 (3, 4)" /><br /><div class="answer" id="res8dad5810df65e3d5dd6f65bf9d21381d"><code class="result">(15, 20)</code><code> :: </code><code class="type">(Integer, Integer)</code></div></form>
</section>
<section id="exercise-point-reflection" class="level1">
<h1>Exercise: Point Reflection</h1>
<p>Reflect a point around another point. The first point acts as an origin; the second point is reflected to its opposite side. See the examples below.</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="ot">reflectP ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> (a, a) <span class="ot">-&gt;</span> (a, a) <span class="ot">-&gt;</span> (a, a)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_d36b47d9669831bf6df9c87d1e683a1b.hs','d36b47d9669831bf6df9c87d1e683a1b','d36b47d9669831bf6df9c87d1e683a1b');"><textarea cols="80" rows="3" id="taread36b47d9669831bf6df9c87d1e683a1b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resd36b47d9669831bf6df9c87d1e683a1b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','e4bd396509ce3aeba53d52f2b4814e62','e4bd396509ce3aeba53d52f2b4814e62');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae4bd396509ce3aeba53d52f2b4814e62" value="reflectP (0,0) (4,2)" /><br /><div class="answer" id="rese4bd396509ce3aeba53d52f2b4814e62"><code class="result">(-4, -2)</code><code> :: </code><code class="type">(Integer, Integer)</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','66d6e1e800af34ce5f7b5dcff2d28f32','66d6e1e800af34ce5f7b5dcff2d28f32');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea66d6e1e800af34ce5f7b5dcff2d28f32" value="reflectP (1,1) (4,2)" /><br /><div class="answer" id="res66d6e1e800af34ce5f7b5dcff2d28f32"><code class="result">(-2, 0)</code><code> :: </code><code class="type">(Integer, Integer)</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','65f29cce09e99dbe500026c94399f546','65f29cce09e99dbe500026c94399f546');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea65f29cce09e99dbe500026c94399f546" value="reflectP (2,5) (4,2)" /><br /><div class="answer" id="res65f29cce09e99dbe500026c94399f546"><code class="result">(0, 8)</code><code> :: </code><code class="type">(Integer, Integer)</code></div></form>
</section>
<section id="exercise-distance" class="level1">
<h1>Exercise: Distance [*]</h1>
<p>Calculate the distance of two points.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="ot">distance ::</span> <span class="dt">Floating</span> t <span class="ot">=&gt;</span> (t, t) <span class="ot">-&gt;</span> (t, t) <span class="ot">-&gt;</span> t</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_ac794d6cb01c3e32bd2f6159a34f7ff9.hs','ac794d6cb01c3e32bd2f6159a34f7ff9','ac794d6cb01c3e32bd2f6159a34f7ff9');"><textarea cols="80" rows="3" id="tareaac794d6cb01c3e32bd2f6159a34f7ff9"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resac794d6cb01c3e32bd2f6159a34f7ff9"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','0b1bfcef444f6f2ca4d4ad0ccea9e0ca','0b1bfcef444f6f2ca4d4ad0ccea9e0ca');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0b1bfcef444f6f2ca4d4ad0ccea9e0ca" value="abs (distance (2,-5) (5,-1) - 5) &lt; 0.01" /><br /><div class="answer" id="res0b1bfcef444f6f2ca4d4ad0ccea9e0ca"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<div class="handout">
<hr />
<p>You can use the absolute value function:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','7672357290e630304116ad04579f31d9','7672357290e630304116ad04579f31d9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7672357290e630304116ad04579f31d9" value="abs :: Num a =&gt; a -&gt; a" /><br /><div class="answer" id="res7672357290e630304116ad04579f31d9"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','91b71bfece41f0d4a2522e93ddc76529','91b71bfece41f0d4a2522e93ddc76529');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea91b71bfece41f0d4a2522e93ddc76529" value="abs (10-50)" /><br /><div class="answer" id="res91b71bfece41f0d4a2522e93ddc76529"><code class="result">40</code><code> :: </code><code class="type">Integer</code></div></form>
<p>You can use the square root function:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','e9a47c07bd3780e5e57f386696cced43','e9a47c07bd3780e5e57f386696cced43');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae9a47c07bd3780e5e57f386696cced43" value="sqrt :: Floating a =&gt; a -&gt; a" /><br /><div class="answer" id="rese9a47c07bd3780e5e57f386696cced43"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','d005c8e2cba99620b94817c419bc68ce','d005c8e2cba99620b94817c419bc68ce');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread005c8e2cba99620b94817c419bc68ce" value="abs (sqrt 2 - 1.41) &lt; 0.01" /><br /><div class="answer" id="resd005c8e2cba99620b94817c419bc68ce"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</div>
</section>
<section id="patterns-for-numbers-characters-and-strings" class="level1">
<h1>Patterns for Numbers, Characters, and Strings</h1>
<p>Values can be used to match patterns in function parameters of different types. For example:</p>
<p><code>Integer</code>: …, <code>-2</code>, <code>-1</code>, <code>0</code>, <code>1</code>, <code>2</code>, …</p>
<p><code>Double</code>: …, <code>-2</code>, <code>-1</code>, <code>0</code>, <code>1</code>, <code>2</code>, …, <code>4.3</code>, …</p>
<p><code>Char</code>: <code>'x'</code>, <code>'\n'</code>, …</p>
<p><code>String</code>: <code>&quot;&quot;</code>, <code>&quot;abc&quot;</code>, …</p>
</section>
<section id="exercise-modulo-3-multiplication" class="level1">
<h1>Exercise: Modulo 3 Multiplication [*]</h1>
<p>Define modulo 3 multiplication. This means that for every <code>x</code> and <code>y</code> between 0 and 3, this expression will be true:</p>
<pre><code>x `mul3` y == (x * y) `mod` 3</code></pre>
<p>Use pattern matching to achieve this. Do not use the <code>mod</code> function or multiplication operator in your solution!</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">mul3 ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</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=Patterns_en_79f3776269ec6ed225854a32997d60f6.hs','79f3776269ec6ed225854a32997d60f6','79f3776269ec6ed225854a32997d60f6');"><textarea cols="80" rows="7" id="tarea79f3776269ec6ed225854a32997d60f6"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res79f3776269ec6ed225854a32997d60f6"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','a4ea4c8d3bca57973adcf81714c4e208','a4ea4c8d3bca57973adcf81714c4e208');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa4ea4c8d3bca57973adcf81714c4e208" value="2 `mul3` 2" /><br /><div class="answer" id="resa4ea4c8d3bca57973adcf81714c4e208"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','7afed67ddbfdad6a959fd0403134e8df','7afed67ddbfdad6a959fd0403134e8df');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7afed67ddbfdad6a959fd0403134e8df" value="0 `mul3` 2" /><br /><div class="answer" id="res7afed67ddbfdad6a959fd0403134e8df"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','39fd4e007e01ec5e1a9abf7d2956cfaa','39fd4e007e01ec5e1a9abf7d2956cfaa');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea39fd4e007e01ec5e1a9abf7d2956cfaa" value="2 `mul3` 1" /><br /><div class="answer" id="res39fd4e007e01ec5e1a9abf7d2956cfaa"><code class="result">2</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-replace-line-break-with-space" class="level1">
<h1>Exercise: Replace Line Break with Space</h1>
<p>Define a function that replaces a line break with a space, and otherwise returns the same value. Recall that ‘’ is the character value for a newline.</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="ot">replaceNewline ::</span> <span class="dt">Char</span> <span class="ot">-&gt;</span> <span class="dt">Char</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_b727df98c3775057f44db889a72c7d2f.hs','b727df98c3775057f44db889a72c7d2f','b727df98c3775057f44db889a72c7d2f');"><textarea cols="80" rows="4" id="tareab727df98c3775057f44db889a72c7d2f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb727df98c3775057f44db889a72c7d2f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','fef612a8751c930e41eabd6c4d7b33c2','fef612a8751c930e41eabd6c4d7b33c2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafef612a8751c930e41eabd6c4d7b33c2" value="replaceNewline  'x'" /><br /><div class="answer" id="resfef612a8751c930e41eabd6c4d7b33c2"><code class="result">'x'</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','70b6ba1ed7dc0d2a902a9836e41e7cb2','70b6ba1ed7dc0d2a902a9836e41e7cb2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea70b6ba1ed7dc0d2a902a9836e41e7cb2" value="replaceNewline '\n'" /><br /><div class="answer" id="res70b6ba1ed7dc0d2a902a9836e41e7cb2"><code class="result">' '</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','b4137a6f0cdeb3af89413fb1a6e0656b','b4137a6f0cdeb3af89413fb1a6e0656b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab4137a6f0cdeb3af89413fb1a6e0656b" value="replaceNewline  'y'" /><br /><div class="answer" id="resb4137a6f0cdeb3af89413fb1a6e0656b"><code class="result">'y'</code><code> :: </code><code class="type">Char</code></div></form>
</section>
<section id="exercise-replace-all-line-breaks-with-spaces" class="level1">
<h1>Exercise: Replace All Line Breaks with Spaces</h1>
<p>Define a function that replaces all line breaks with spaces. Use <code>replaceNewline</code>.</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">replaceNewlines ::</span> <span class="dt">String</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=Patterns_en_396aaeb660e057300de6d2dd5b83965d.hs','396aaeb660e057300de6d2dd5b83965d','396aaeb660e057300de6d2dd5b83965d');"><textarea cols="80" rows="4" id="tarea396aaeb660e057300de6d2dd5b83965d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res396aaeb660e057300de6d2dd5b83965d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','77e69d5b983342bca557cdabbb857a7f','77e69d5b983342bca557cdabbb857a7f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea77e69d5b983342bca557cdabbb857a7f" value="replaceNewlines &quot;\na b\n c&quot;" /><br /><div class="answer" id="res77e69d5b983342bca557cdabbb857a7f"><code class="result">&quot; a b  c&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-swap-this-and-that" class="level1">
<h1>Exercise: Swap “this” and “that” [*]</h1>
<p>Define a function that replaces the words “this” and “that” and vice versa.</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">swapThisAndThat ::</span> <span class="dt">String</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=Patterns_en_b4e9df3e486fe1fd5fb7d73b9fb515e5.hs','b4e9df3e486fe1fd5fb7d73b9fb515e5','b4e9df3e486fe1fd5fb7d73b9fb515e5');"><textarea cols="80" rows="5" id="tareab4e9df3e486fe1fd5fb7d73b9fb515e5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb4e9df3e486fe1fd5fb7d73b9fb515e5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','13dde132ecf406338b14c7b8f816d34a','13dde132ecf406338b14c7b8f816d34a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea13dde132ecf406338b14c7b8f816d34a" value="swapThisAndThat &quot;this&quot;" /><br /><div class="answer" id="res13dde132ecf406338b14c7b8f816d34a"><code class="result">&quot;that&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','ca3e31de6271bed9030b1d70ee6de429','ca3e31de6271bed9030b1d70ee6de429');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaca3e31de6271bed9030b1d70ee6de429" value="swapThisAndThat &quot;that&quot;" /><br /><div class="answer" id="resca3e31de6271bed9030b1d70ee6de429"><code class="result">&quot;this&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','d40a766927fbe6679cffb5781e56d55e','d40a766927fbe6679cffb5781e56d55e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread40a766927fbe6679cffb5781e56d55e" value="swapThisAndThat &quot;thistle&quot;" /><br /><div class="answer" id="resd40a766927fbe6679cffb5781e56d55e"><code class="result">&quot;thistle&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','93de92cf0466f539c20e7932e370f2b2','93de92cf0466f539c20e7932e370f2b2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea93de92cf0466f539c20e7932e370f2b2" value="swapThisAndThat &quot;thatch&quot;" /><br /><div class="answer" id="res93de92cf0466f539c20e7932e370f2b2"><code class="result">&quot;thatch&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-swap-all-this-and-that" class="level1">
<h1>Exercise: Swap All “this” and “that” [*]</h1>
<p>Define a function that swaps all instances of “this” and “that”.</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">swapAllThisAndThat ::</span> <span class="dt">String</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=Patterns_en_f3de873168549c251879f92847d5bbe1.hs','f3de873168549c251879f92847d5bbe1','f3de873168549c251879f92847d5bbe1');"><textarea cols="80" rows="4" id="tareaf3de873168549c251879f92847d5bbe1"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf3de873168549c251879f92847d5bbe1"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','2aa433c1c5236e755641e25cf1885f4c','2aa433c1c5236e755641e25cf1885f4c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2aa433c1c5236e755641e25cf1885f4c" value="swapAllThisAndThat &quot;this is that word&quot;" /><br /><div class="answer" id="res2aa433c1c5236e755641e25cf1885f4c"><code class="result">&quot;that is this word&quot;</code><code> :: </code><code class="type">String</code></div></form>
<p>Hint: Use the <code>words</code> and <code>unwords</code> functions.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','df025fc9be745761fdfdc59a934b084e','df025fc9be745761fdfdc59a934b084e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadf025fc9be745761fdfdc59a934b084e" value="words &quot;this is that apple&quot;" /><br /><div class="answer" id="resdf025fc9be745761fdfdc59a934b084e"><code class="result">[&quot;this&quot;, &quot;is&quot;, &quot;that&quot;, &quot;apple&quot;]</code><code> :: </code><code class="type">[String]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','1fcbf845602a9276457b6bea7a884eee','1fcbf845602a9276457b6bea7a884eee');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1fcbf845602a9276457b6bea7a884eee" value="unwords [&quot;this&quot;, &quot;is&quot;, &quot;that&quot;, &quot;apple&quot;]" /><br /><div class="answer" id="res1fcbf845602a9276457b6bea7a884eee"><code class="result">&quot;this is that apple&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="patterns-for-lists" class="level1">
<h1>Patterns for Lists</h1>
<p>We have shown that we can match patterns for Strings, Ints, tuples, etc. We can also match lists. In particular, we can express requirements about the size of the list. Only a list matching the requirements will invoke the function’s rule:</p>
<p>Match any list: <code>a</code> Match an empty list: <code>[]</code><br />
Match a list with exactly one item (“singleton”): <code>[a]</code><br />
Match a list with exactly two items: <code>[a,b]</code><br />
Match a list with exactly three items: <code>[a,b,c]</code><br />
Match a non-empty list: <code>(a:b)</code></p>
<p>Note that when we use a pattern like <code>[a,b]</code>, the name <code>a</code> refers to the first item in the list, and the name <code>b</code> refers to the second item in the list. When we use a pattern like <code>(a:b)</code>, <code>a</code> refers to the first item in the list, and <code>b</code> refers to the rest of the list; therefore <code>b</code> will be a (possibly empty) list.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','b51904bedb7f2b1a7fc031071f1b2127','b51904bedb7f2b1a7fc031071f1b2127');"><div class="answer" id="resb51904bedb7f2b1a7fc031071f1b2127"><code class="result">[]</code><code> :: </code><code class="type">[a]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','9a76e7340275a2db9f77f1ed73a31583','9a76e7340275a2db9f77f1ed73a31583');"><div class="answer" id="res9a76e7340275a2db9f77f1ed73a31583"><code class="result">(:)</code><code> :: </code><code class="type">a -&gt; [a] -&gt; [a]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','b15ea17b627b339a363fa631e1035245','b15ea17b627b339a363fa631e1035245');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab15ea17b627b339a363fa631e1035245" value="'h':&quot;ello&quot;" /><br /><div class="answer" id="resb15ea17b627b339a363fa631e1035245"><code class="result">&quot;hello&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p>For example (functions from the <code>Prelude</code>):</p>
<p><code>null</code> returns <code>True</code> when its parameter is an empty list.</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb21-1" data-line-number="1">null<span class="ot"> ::</span> [a] <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb21-2" data-line-number="2">null [] <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb21-3" data-line-number="3">null _  <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<p><code>head</code> returns the first item of a list.</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb22-1" data-line-number="1">head<span class="ot"> ::</span> [a] <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb22-2" data-line-number="2">head (x<span class="fu">:</span>xs) <span class="fu">=</span> x</a></code></pre></div>
<p><code>tail</code> returns all items of a list <em>except</em> the first.</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb23-1" data-line-number="1">tail<span class="ot"> ::</span> [a] <span class="ot">-&gt;</span> [a]</a>
<a class="sourceLine" id="cb23-2" data-line-number="2">tail (x<span class="fu">:</span>xs) <span class="fu">=</span> xs</a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','579215fcc815234f65b86cee34f1286e','579215fcc815234f65b86cee34f1286e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea579215fcc815234f65b86cee34f1286e" value="head &quot;hello&quot;" /><br /><div class="answer" id="res579215fcc815234f65b86cee34f1286e"><code class="result">'h'</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','f68462e01f1d57b7ca1106fd4775dfba','f68462e01f1d57b7ca1106fd4775dfba');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf68462e01f1d57b7ca1106fd4775dfba" value="null &quot;&quot; &amp;&amp; not (null &quot;ok&quot;)" /><br /><div class="answer" id="resf68462e01f1d57b7ca1106fd4775dfba"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','44fadec6d8ddb30136c326bd5a7d97b3','44fadec6d8ddb30136c326bd5a7d97b3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea44fadec6d8ddb30136c326bd5a7d97b3" value="tail &quot;hello&quot;" /><br /><div class="answer" id="res44fadec6d8ddb30136c326bd5a7d97b3"><code class="result">&quot;ello&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<div class="handout">
<hr />
<p>Two basic patterns for lists that could be used to build more complex list patterns are as follows.</p>
<ul>
<li>Empty list: <code>[]</code></li>
<li>List decomposition: <code>(h:t)</code></li>
</ul>
<p>In the <code>h:t</code> pattern, the <code>h</code> and <code>t</code> may be arbitrary patterns, i.e. this is a complex pattern.</p>
<p>Semantics:</p>
<ul>
<li>The <code>[]</code> pattern matches only the empty list.</li>
<li>The <code>h:t</code> pattern matches only if the list is not empty: the <code>h</code> matches the head of the list, while <code>t</code> matches the tail of the list.</li>
</ul>
<p>Type of the “colon”:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','04dadbdc2bc9c9f70432d3fa85941a00','04dadbdc2bc9c9f70432d3fa85941a00');"><div class="answer" id="res04dadbdc2bc9c9f70432d3fa85941a00"><code class="result">(:)</code><code> :: </code><code class="type">a -&gt; [a] -&gt; [a]</code></div></form>
<p>Thus if the type of <code>h:t</code> is <code>[x]</code> then the type of <code>h</code> is <code>x</code>, and the type of <code>t</code> is <code>[x]</code>.</p>
<p>The colon operator is right-associative.</p>
</div>
</section>
<section id="exercise-is-a-singleton-list" class="level1">
<h1>Exercise: Is A Singleton List? [*]</h1>
<p>Define a function that tests the given list is a singleton one. Use pattern matching.</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">isSingleton ::</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=Patterns_en_f0013ca7b684f69799bc644824aedb75.hs','f0013ca7b684f69799bc644824aedb75','f0013ca7b684f69799bc644824aedb75');"><textarea cols="80" rows="4" id="tareaf0013ca7b684f69799bc644824aedb75"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf0013ca7b684f69799bc644824aedb75"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','deba15835eaa4d53afb134bedda3da52','deba15835eaa4d53afb134bedda3da52');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadeba15835eaa4d53afb134bedda3da52" value="isSingleton [x | x&lt;-[1..5], odd x]" /><br /><div class="answer" id="resdeba15835eaa4d53afb134bedda3da52"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','15c0d8cbe6f29b3459036ba276d45ccf','15c0d8cbe6f29b3459036ba276d45ccf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea15c0d8cbe6f29b3459036ba276d45ccf" value="isSingleton [x | x&lt;-[1..3], even x]" /><br /><div class="answer" id="res15c0d8cbe6f29b3459036ba276d45ccf"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-capitalize-initial-letter" class="level1">
<h1>Exercise: Capitalize Initial Letter [*]</h1>
<p>Convert the initial letter of an arbitrary word to uppercase.</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="ot">toUpperFirst ::</span> <span class="dt">String</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=Patterns_en_51acd527383936a5269b9c77c8913cf5.hs','51acd527383936a5269b9c77c8913cf5','51acd527383936a5269b9c77c8913cf5');"><textarea cols="80" rows="4" id="tarea51acd527383936a5269b9c77c8913cf5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res51acd527383936a5269b9c77c8913cf5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','4ecec256ee163d258022ef04aa42dc01','4ecec256ee163d258022ef04aa42dc01');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4ecec256ee163d258022ef04aa42dc01" value="toUpperFirst &quot;apple&quot;" /><br /><div class="answer" id="res4ecec256ee163d258022ef04aa42dc01"><code class="result">&quot;Apple&quot;</code><code> :: </code><code class="type">String</code></div></form>
<p>Hint: use the function <code>toUpper</code>:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','000f8e5bc49f917e698c153572026e62','000f8e5bc49f917e698c153572026e62');"><div class="answer" id="res000f8e5bc49f917e698c153572026e62"><code class="result">toUpper</code><code> :: </code><code class="type">Char -&gt; Char</code></div></form>
</section>
<section id="exercise-capitalize-all-initial-letters" class="level1">
<h1>Exercise: Capitalize All Initial Letters</h1>
<p>Convert the initial letter of every word in a string to uppercase.</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="ot">toUpperFirsts ::</span> <span class="dt">String</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=Patterns_en_ff22d7fc9c21bf6daa815559b76d1a58.hs','ff22d7fc9c21bf6daa815559b76d1a58','ff22d7fc9c21bf6daa815559b76d1a58');"><textarea cols="80" rows="4" id="tareaff22d7fc9c21bf6daa815559b76d1a58"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resff22d7fc9c21bf6daa815559b76d1a58"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','4f559df610ab3502728f4d9b09cdf6fd','4f559df610ab3502728f4d9b09cdf6fd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4f559df610ab3502728f4d9b09cdf6fd" value="toUpperFirsts &quot;the principles of mathematics&quot;" /><br /><div class="answer" id="res4f559df610ab3502728f4d9b09cdf6fd"><code class="result">&quot;The Principles Of Mathematics&quot;</code><code> :: </code><code class="type">String</code></div></form>
<p>Hint: use your <code>toUpperFirst</code> function and <code>words</code> and <code>unwords</code></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','9dae830b76355e30ba536923d04331ef','9dae830b76355e30ba536923d04331ef');"><div class="answer" id="res9dae830b76355e30ba536923d04331ef"><code class="result">words</code><code> :: </code><code class="type">String -&gt; [String]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','3b2fddd2c7210b4c0d54bbc80d3b128a','3b2fddd2c7210b4c0d54bbc80d3b128a');"><div class="answer" id="res3b2fddd2c7210b4c0d54bbc80d3b128a"><code class="result">unwords</code><code> :: </code><code class="type">[String] -&gt; String</code></div></form>
</section>
<section id="patterns-in-list-comprehensions" class="level1">
<h1>Patterns in List Comprehensions</h1>
<p>Patterns can be even employed in list comprehensions. Here is an intuitive example for this:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','6d4e6002d42f1267bb1453ecc0c3bde9','6d4e6002d42f1267bb1453ecc0c3bde9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6d4e6002d42f1267bb1453ecc0c3bde9" value="[x | (x,1)&lt;- [('c',2),('d',1),('e',1)]]" /><br /><div class="answer" id="res6d4e6002d42f1267bb1453ecc0c3bde9"><code class="result">&quot;de&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
<section id="exercise-identical-words-in-a-text" class="level1">
<h1>Exercise: Identical Words in a Text</h1>
<p>Count the “a” words in a text.</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="ot">countOfAs ::</span> <span class="dt">String</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=Patterns_en_554f90cbaac0f6f29a00ea58ed8a05ea.hs','554f90cbaac0f6f29a00ea58ed8a05ea','554f90cbaac0f6f29a00ea58ed8a05ea');"><textarea cols="80" rows="3" id="tarea554f90cbaac0f6f29a00ea58ed8a05ea"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res554f90cbaac0f6f29a00ea58ed8a05ea"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','b0b8156220e55a483b139d00338e49e9','b0b8156220e55a483b139d00338e49e9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab0b8156220e55a483b139d00338e49e9" value="countOfAs &quot;This is a text which may not be a text.&quot;" /><br /><div class="answer" id="resb0b8156220e55a483b139d00338e49e9"><code class="result">2</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','2aa004a39781873b4eba937343cfa7d2','2aa004a39781873b4eba937343cfa7d2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2aa004a39781873b4eba937343cfa7d2" value="countOfAs &quot;There is no a here, but perhaps after an a.&quot;" /><br /><div class="answer" id="res2aa004a39781873b4eba937343cfa7d2"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','0f5e0d5b3e134ea1457d4b8c0163d4f3','0f5e0d5b3e134ea1457d4b8c0163d4f3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0f5e0d5b3e134ea1457d4b8c0163d4f3" value="countOfAs &quot;Salut toute le monde, je suis ici.&quot;" /><br /><div class="answer" id="res0f5e0d5b3e134ea1457d4b8c0163d4f3"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-filter-by-distance-of-elements" class="level1">
<h1>Exercise: Filter by Distance of Elements</h1>
<p>Count pairs in a list where the distance between the components is greater than or equal to 2.</p>
<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="ot">distantPairs ::</span> [(<span class="dt">Integer</span>,<span class="dt">Integer</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=Patterns_en_7a5cbc9ea15b8eb995c2c952c8e8031b.hs','7a5cbc9ea15b8eb995c2c952c8e8031b','7a5cbc9ea15b8eb995c2c952c8e8031b');"><textarea cols="80" rows="3" id="tarea7a5cbc9ea15b8eb995c2c952c8e8031b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res7a5cbc9ea15b8eb995c2c952c8e8031b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','7f970e369c5dc547253214b00ea0f4c9','7f970e369c5dc547253214b00ea0f4c9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7f970e369c5dc547253214b00ea0f4c9" value="distantPairs []" /><br /><div class="answer" id="res7f970e369c5dc547253214b00ea0f4c9"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','76d721f10b3bc0f98c157dc6f67f0f9d','76d721f10b3bc0f98c157dc6f67f0f9d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea76d721f10b3bc0f98c157dc6f67f0f9d" value="distantPairs [(0,2)]" /><br /><div class="answer" id="res76d721f10b3bc0f98c157dc6f67f0f9d"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','8cbf4b262c98c17f83792ecd07ef3453','8cbf4b262c98c17f83792ecd07ef3453');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8cbf4b262c98c17f83792ecd07ef3453" value="distantPairs [(1,2),(3,4),(5,6)]" /><br /><div class="answer" id="res8cbf4b262c98c17f83792ecd07ef3453"><code class="result">0</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','2a2b213a8ef8e5d7ad77d614cc530230','2a2b213a8ef8e5d7ad77d614cc530230');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a2b213a8ef8e5d7ad77d614cc530230" value="distantPairs [(1,2),(3,6),(7,8)]" /><br /><div class="answer" id="res2a2b213a8ef8e5d7ad77d614cc530230"><code class="result">1</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-every-fifth-element-of-a-list" class="level1">
<h1>Exercise: Every Fifth Element of a List</h1>
<p>Take every fifth element of a list.</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">everyFifth ::</span> [a] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Patterns_en_8e80d7bbb241d82f106bcab0934a6956.hs','8e80d7bbb241d82f106bcab0934a6956','8e80d7bbb241d82f106bcab0934a6956');"><textarea cols="80" rows="3" id="tarea8e80d7bbb241d82f106bcab0934a6956"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res8e80d7bbb241d82f106bcab0934a6956"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','56439c61118148572cc87a500e83ab4c','56439c61118148572cc87a500e83ab4c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea56439c61118148572cc87a500e83ab4c" value="everyFifth &quot;Hello therei!&quot;" /><br /><div class="answer" id="res56439c61118148572cc87a500e83ab4c"><code class="result">&quot;H e&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','9ce27cc7bfa8017e692a134e71c1b8d9','9ce27cc7bfa8017e692a134e71c1b8d9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9ce27cc7bfa8017e692a134e71c1b8d9" value="everyFifth [100,99..11]" /><br /><div class="answer" id="res9ce27cc7bfa8017e692a134e71c1b8d9"><code class="result">[100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25,
 20, 15]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Patterns_en.hs','3b6e672e599fd355611dcbb3e4757131','3b6e672e599fd355611dcbb3e4757131');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3b6e672e599fd355611dcbb3e4757131" value="everyFifth [True,False,True]" /><br /><div class="answer" id="res3b6e672e599fd355611dcbb3e4757131"><code class="result">[True]</code><code> :: </code><code class="type">[Bool]</code></div></form>
<p>Hint: Use the <code>zip</code> function.</p>
</section>
</body>
</html>

