<?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>Function 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">Function Definitions</h1>
<div id="info"></div>
<ul>
<li><a href="#basics">Basics</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>
<li><a href="#exercise-3">Exercise</a></li>
<li><a href="#exercise-4">Exercise</a></li>
<li><a href="#exercise-5">Exercise</a></li>
<li><a href="#exercise-6">Exercise</a></li>
<li><a href="#exercise-7">Exercise</a></li>
</ul></li>
<li><a href="#definition-of-operators">Definition of Operators</a></li>
<li><a href="#pattern-matching">Pattern Matching</a><ul>
<li><a href="#exercise-8">Exercise</a></li>
</ul></li>
<li><a href="#pair-patterns">Pair Patterns</a><ul>
<li><a href="#exercise-9">Exercise</a></li>
<li><a href="#exercise-10">Exercise</a></li>
<li><a href="#exercise-11">Exercise</a></li>
<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>
</ul></li>
<li><a href="#list-patterns">List Patterns</a><ul>
<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>
</ul></li>
<li><a href="#guards">Guards</a><ul>
<li><a href="#exercise-21">Exercise</a></li>
</ul></li>
<li><a href="#fast-exponentiation">Fast Exponentiation</a></li>
<li><a href="#pattern-matching-with-guards">Pattern Matching with Guards</a><ul>
<li><a href="#exercise-22">Exercise</a></li>
</ul></li>
<li><a href="#local-definitions">Local Definitions</a><ul>
<li><a href="#exercise-23">Exercise</a></li>
</ul></li>
<li><a href="#sections">Sections</a></li>
<li><a href="#higher-order-functions">Higher-Order Functions</a><ul>
<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>
</ul></li>
<li><a href="#the-operator">The <code>($)</code> operator</a></li>
<li><a href="#lambda-functions">Lambda Functions</a><ul>
<li><a href="#exercise-36">Exercise</a></li>
</ul></li>
<li><a href="#group-and-groupby"><code>group</code> and <code>groupBy</code></a></li>
<li><a href="#the-on-function">The <code>on</code> function</a><ul>
<li><a href="#exercise-37">Exercise</a></li>
</ul></li>
<li><a href="#compare-and-ordering"><code>compare</code> and <code>Ordering</code></a></li>
<li><a href="#maximumby-minimumby-and-sortby"><code>maximumBy</code>, <code>minimumBy</code>, and <code>sortBy</code></a></li>
<li><a href="#prelude.flip"><code>Prelude.flip</code></a><ul>
<li><a href="#exercise-38">Exercise</a></li>
<li><a href="#exercise-39">Exercise</a></li>
<li><a href="#exercise-40">Exercise</a></li>
</ul></li>
<li><a href="#function-composition">Function Composition</a><ul>
<li><a href="#exercise-41">Exercise</a></li>
<li><a href="#exercise-42">Exercise</a></li>
<li><a href="#exercise-43">Exercise</a></li>
<li><a href="#exercise-44">Exercise</a></li>
<li><a href="#exercise-45">Exercise</a></li>
<li><a href="#exercise-46">Exercise</a></li>
</ul></li>
<li><a href="#folds-without-starting-value">Folds without Starting Value</a><ul>
<li><a href="#exercise-47">Exercise</a></li>
</ul></li>
<li><a href="#folds-with-starting-value">Folds with Starting Value</a><ul>
<li><a href="#exercise-48">Exercise</a></li>
<li><a href="#exercise-49">Exercise</a></li>
</ul></li>
<li><a href="#additional-fold-examples">Additional Fold Examples</a></li>
<li><a href="#scans">Scans</a></li>
</ul>
</div>
<section id="basics" class="level1">
<h1>Basics</h1>
<p>We have already used functions. Now we will create functions.</p>
<p>This function takes one parameter (<code>x</code>) and produces a value.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" data-line-number="1">f x <span class="fu">=</span> x <span class="fu">+</span> <span class="dv">1</span></a></code></pre></div>
<p>Function with two parameters. The names of the parameters are <code>a</code> and <code>b</code>. The type of <code>a</code> is <code>Integer</code> and the type of <code>b</code> is <code>Integer</code>. The value produced by the function is <code>Integer</code>. We use <code>::</code> operator to explicitly give the type of the function, where <code>-&gt;</code> separates the types of the parameters and the result value. We pronounce this as “Integer to Integer to Integer”.</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">g ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span></a>
<a class="sourceLine" id="cb2-2" data-line-number="2">g a b <span class="fu">=</span> a <span class="fu">*</span> b <span class="fu">+</span> <span class="dv">1</span></a></code></pre></div>
<section id="exercise" class="level2">
<h2>Exercise</h2>
<p>Generate the following list: [1, 2, …, n-1, n, n-1, …, 2, 1]</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">mountain ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_fe79eef4cd115bf759fe02e24bd523ee.hs','fe79eef4cd115bf759fe02e24bd523ee','fe79eef4cd115bf759fe02e24bd523ee');"><textarea cols="80" rows="3" id="tareafe79eef4cd115bf759fe02e24bd523ee"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resfe79eef4cd115bf759fe02e24bd523ee"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','f7123394596ab62d4edde5b435b11387','f7123394596ab62d4edde5b435b11387');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf7123394596ab62d4edde5b435b11387" value="mountain 3" /><br /><div class="answer" id="resf7123394596ab62d4edde5b435b11387"><code class="result">[1, 2, 3, 2, 1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','5edd83b84410a10740776969a896f83c','5edd83b84410a10740776969a896f83c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5edd83b84410a10740776969a896f83c" value="mountain 1" /><br /><div class="answer" id="res5edd83b84410a10740776969a896f83c"><code class="result">[1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','90cd8eec1eb2fc05c7fc579ea569052a','90cd8eec1eb2fc05c7fc579ea569052a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea90cd8eec1eb2fc05c7fc579ea569052a" value="mountain 0" /><br /><div class="answer" id="res90cd8eec1eb2fc05c7fc579ea569052a"><code class="result">[]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','89df7705704caff089120d94758a8d9f','89df7705704caff089120d94758a8d9f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea89df7705704caff089120d94758a8d9f" value="mountain (-1)" /><br /><div class="answer" id="res89df7705704caff089120d94758a8d9f"><code class="result">[]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-1" class="level2">
<h2>Exercise</h2>
<p>Given sides of a triangle as <code>a</code>, <code>b</code>, <code>c</code>, decide whether the given triangle can be constructed.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="ot">areTriangleSides ::</span> <span class="dt">Real</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_1149c6b9a4f562c4c830dadfae2ebc08.hs','1149c6b9a4f562c4c830dadfae2ebc08','1149c6b9a4f562c4c830dadfae2ebc08');"><textarea cols="80" rows="3" id="tarea1149c6b9a4f562c4c830dadfae2ebc08"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1149c6b9a4f562c4c830dadfae2ebc08"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','6cc543dd354a404c8e6fa3b89d3a4cb3','6cc543dd354a404c8e6fa3b89d3a4cb3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6cc543dd354a404c8e6fa3b89d3a4cb3" value="areTriangleSides 3 4 5" /><br /><div class="answer" id="res6cc543dd354a404c8e6fa3b89d3a4cb3"><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_FunDef_en.hs','8ebd3adfb374877086e6f43419b266b4','8ebd3adfb374877086e6f43419b266b4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8ebd3adfb374877086e6f43419b266b4" value="areTriangleSides 3 1 5" /><br /><div class="answer" id="res8ebd3adfb374877086e6f43419b266b4"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-2" class="level2">
<h2>Exercise</h2>
<p>Redefine the <code>even</code> function from the <code>Prelude</code> module, which determines a given integer is even.</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb5-1" data-line-number="1">even<span class="ot"> ::</span> <span class="dt">Integer</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_FunDef_en_b85d295ddf9795b0c7487c22f9e9d73f.hs','b85d295ddf9795b0c7487c22f9e9d73f','b85d295ddf9795b0c7487c22f9e9d73f');"><textarea cols="80" rows="3" id="tareab85d295ddf9795b0c7487c22f9e9d73f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb85d295ddf9795b0c7487c22f9e9d73f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c08dae934dcbb7e9bf1893c312b64b35','c08dae934dcbb7e9bf1893c312b64b35');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac08dae934dcbb7e9bf1893c312b64b35" value="even 15" /><br /><div class="answer" id="resc08dae934dcbb7e9bf1893c312b64b35"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','61c04b3ddcee34bd32c2284c7c1fd0c7','61c04b3ddcee34bd32c2284c7c1fd0c7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea61c04b3ddcee34bd32c2284c7c1fd0c7" value="even 16" /><br /><div class="answer" id="res61c04b3ddcee34bd32c2284c7c1fd0c7"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-3" class="level2">
<h2>Exercise</h2>
<p>Redefine the <code>odd</code> function from the <code>Prelude</code> module, which determines a given integer is odd.</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" data-line-number="1">odd<span class="ot"> ::</span> <span class="dt">Integer</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_FunDef_en_1bc52c803d6691a7c8c0d2f1aed65bf2.hs','1bc52c803d6691a7c8c0d2f1aed65bf2','1bc52c803d6691a7c8c0d2f1aed65bf2');"><textarea cols="80" rows="3" id="tarea1bc52c803d6691a7c8c0d2f1aed65bf2"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1bc52c803d6691a7c8c0d2f1aed65bf2"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','e4f9d43e4669e92b294581f72068fe97','e4f9d43e4669e92b294581f72068fe97');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae4f9d43e4669e92b294581f72068fe97" value="odd 15" /><br /><div class="answer" id="rese4f9d43e4669e92b294581f72068fe97"><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_FunDef_en.hs','e370d988f23156e5321ff4e480815e0f','e370d988f23156e5321ff4e480815e0f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae370d988f23156e5321ff4e480815e0f" value="[odd x | x&lt;-[1..5]]" /><br /><div class="answer" id="rese370d988f23156e5321ff4e480815e0f"><code class="result">[True, False, True, False, True]</code><code> :: </code><code class="type">[Bool]</code></div></form>
</section>
<section id="exercise-4" class="level2">
<h2>Exercise</h2>
<p>Define the divisibility.</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="ot">divides ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</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_FunDef_en_500e5957efa8b5ea974941e04c031312.hs','500e5957efa8b5ea974941e04c031312','500e5957efa8b5ea974941e04c031312');"><textarea cols="80" rows="3" id="tarea500e5957efa8b5ea974941e04c031312"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res500e5957efa8b5ea974941e04c031312"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7fe24c433f72d25980cfdbd6c7a8d095','7fe24c433f72d25980cfdbd6c7a8d095');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7fe24c433f72d25980cfdbd6c7a8d095" value="3 `divides` 12" /><br /><div class="answer" id="res7fe24c433f72d25980cfdbd6c7a8d095"><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_FunDef_en.hs','27e299b5c52a856e3882f1203e0d6a66','27e299b5c52a856e3882f1203e0d6a66');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea27e299b5c52a856e3882f1203e0d6a66" value="3 `divides` 13" /><br /><div class="answer" id="res27e299b5c52a856e3882f1203e0d6a66"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-5" class="level2">
<h2>Exercise</h2>
<p>Calculate the sum of squares from <code>1</code> to <code>n</code>.</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">sumSquaresTo ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_6662a0eec0490e8221e1a773dbe4bc52.hs','6662a0eec0490e8221e1a773dbe4bc52','6662a0eec0490e8221e1a773dbe4bc52');"><textarea cols="80" rows="5" id="tarea6662a0eec0490e8221e1a773dbe4bc52"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res6662a0eec0490e8221e1a773dbe4bc52"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','787c62b024de729538234e2bed4616c3','787c62b024de729538234e2bed4616c3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea787c62b024de729538234e2bed4616c3" value="sumSquaresTo 0" /><br /><div class="answer" id="res787c62b024de729538234e2bed4616c3"><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_FunDef_en.hs','0e922ba44d9755b32af6b4b4d98ad1d7','0e922ba44d9755b32af6b4b4d98ad1d7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0e922ba44d9755b32af6b4b4d98ad1d7" value="sumSquaresTo 4" /><br /><div class="answer" id="res0e922ba44d9755b32af6b4b4d98ad1d7"><code class="result">30</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','83f44aa5ec3359d51c1a0ad0cb213652','83f44aa5ec3359d51c1a0ad0cb213652');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea83f44aa5ec3359d51c1a0ad0cb213652" value="sumSquaresTo (-1)" /><br /><div class="answer" id="res83f44aa5ec3359d51c1a0ad0cb213652"><code class="result">0</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-6" class="level2">
<h2>Exercise</h2>
<p>Define a function, which given an integer n, returns the positive divisors of n!</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="ot">divisors ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_46ba29fcc0b2f0f31ff0c892292408a1.hs','46ba29fcc0b2f0f31ff0c892292408a1','46ba29fcc0b2f0f31ff0c892292408a1');"><textarea cols="80" rows="3" id="tarea46ba29fcc0b2f0f31ff0c892292408a1"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res46ba29fcc0b2f0f31ff0c892292408a1"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','4aa5307b4197dc816e108577c25cf00c','4aa5307b4197dc816e108577c25cf00c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4aa5307b4197dc816e108577c25cf00c" value="divisors 12" /><br /><div class="answer" id="res4aa5307b4197dc816e108577c25cf00c"><code class="result">[1, 2, 3, 4, 6, 12]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-7" class="level2">
<h2>Exercise</h2>
<p>Define a function that generates a list of proper divisors for a given number.</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">properDivisors ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_e691248cb4b7fb438a5bfe1f6abb8b3d.hs','e691248cb4b7fb438a5bfe1f6abb8b3d','e691248cb4b7fb438a5bfe1f6abb8b3d');"><textarea cols="80" rows="4" id="tareae691248cb4b7fb438a5bfe1f6abb8b3d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese691248cb4b7fb438a5bfe1f6abb8b3d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','8cc9eee70e0dd7013021e193d9830405','8cc9eee70e0dd7013021e193d9830405');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8cc9eee70e0dd7013021e193d9830405" value="properDivisors 12" /><br /><div class="answer" id="res8cc9eee70e0dd7013021e193d9830405"><code class="result">[2, 3, 4, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
</section>
<section id="definition-of-operators" class="level1">
<h1>Definition of Operators</h1>
<p>Operators are functions whose name consists of symbols. We have used many operators, such as <code>++</code> and <code>/</code>. Operators can be defined just a functions. However, note that the name of the operator must be enclosed in parentheses in the type signature.</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">(##) ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb11-2" data-line-number="2">s <span class="fu">##</span> i <span class="fu">=</span> length s <span class="fu">&lt;</span> i</a></code></pre></div>
<p>We can now use this operator with infix notation:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','393b5fd22e3ac1f292226470a1c4c420','393b5fd22e3ac1f292226470a1c4c420');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea393b5fd22e3ac1f292226470a1c4c420" value="&quot;zmrzlina&quot; ## 10" /><br /><div class="answer" id="res393b5fd22e3ac1f292226470a1c4c420"><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_FunDef_en.hs','b0064a8046d650083af7b010ba46c347','b0064a8046d650083af7b010ba46c347');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab0064a8046d650083af7b010ba46c347" value="&quot;Archaeopteryx&quot; ## 3" /><br /><div class="answer" id="resb0064a8046d650083af7b010ba46c347"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="pattern-matching" class="level1">
<h1>Pattern Matching</h1>
<p>A function definition may consist of multiple equation lines. If one equation line cannot be matched against the input, the next will be tried.</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">isUserNameValid ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a>
<a class="sourceLine" id="cb12-2" data-line-number="2">isUserNameValid <span class="st">&quot;&quot;</span> <span class="fu">=</span> <span class="dt">False</span>        <span class="co">-- blank user name is wrong</span></a>
<a class="sourceLine" id="cb12-3" data-line-number="3">isUserNameValid <span class="st">&quot;root&quot;</span> <span class="fu">=</span> <span class="dt">False</span>    <span class="co">-- reserved user name is wrong</span></a>
<a class="sourceLine" id="cb12-4" data-line-number="4">isUserNameValid _ <span class="fu">=</span> <span class="dt">True</span>          <span class="co">-- anything else is okay</span></a></code></pre></div>
<p>Note that <code>_</code>, like a parameter name, will match any value.</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb13-1" data-line-number="1">inWords <span class="dv">0</span> <span class="fu">=</span> <span class="st">&quot;zero&quot;</span></a>
<a class="sourceLine" id="cb13-2" data-line-number="2">inWords <span class="dv">1</span> <span class="fu">=</span> <span class="st">&quot;one&quot;</span></a>
<a class="sourceLine" id="cb13-3" data-line-number="3">inWords <span class="dv">2</span> <span class="fu">=</span> <span class="st">&quot;two&quot;</span></a></code></pre></div>
<p>And its use:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ff829aad0967a34f525d313a96310a89','ff829aad0967a34f525d313a96310a89');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaff829aad0967a34f525d313a96310a89" value="inWords 2 ++ inWords 0" /><br /><div class="answer" id="resff829aad0967a34f525d313a96310a89"><code class="result">&quot;twozero&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p>What happens if we ask for <code>inWords 5</code>?</p>
<p>Here we define the operator <code>&amp;&amp;</code> with pattern matching.</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="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="cb14-2" data-line-number="2"><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="cb14-3" data-line-number="3"><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="cb14-4" data-line-number="4"><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>
<p>Simplified version:</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb15-1" data-line-number="1"><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="cb15-2" data-line-number="2">_     <span class="fu">&amp;&amp;</span> _     <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<p>Alternative simplified version:</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="dt">True</span>  <span class="fu">&amp;&amp;</span> x     <span class="fu">=</span> x</a>
<a class="sourceLine" id="cb16-2" data-line-number="2">_     <span class="fu">&amp;&amp;</span> _     <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<section id="exercise-8" class="level2">
<h2>Exercise</h2>
<p>Redefine logical OR.</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">(||) ::</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=FL_FunDef_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=FL_FunDef_en.hs','a4059626ab3c087364258373c7b82b18','a4059626ab3c087364258373c7b82b18');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa4059626ab3c087364258373c7b82b18" value="True  || True" /><br /><div class="answer" id="resa4059626ab3c087364258373c7b82b18"><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_FunDef_en.hs','5c686ea4674deb44a1e155e483ec245b','5c686ea4674deb44a1e155e483ec245b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5c686ea4674deb44a1e155e483ec245b" value="False || True" /><br /><div class="answer" id="res5c686ea4674deb44a1e155e483ec245b"><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_FunDef_en.hs','a13ff61e328096a841f64f8a1daea346','a13ff61e328096a841f64f8a1daea346');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa13ff61e328096a841f64f8a1daea346" value="True || False" /><br /><div class="answer" id="resa13ff61e328096a841f64f8a1daea346"><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_FunDef_en.hs','4a6a37e5193c8bb939cbcedb503e609d','4a6a37e5193c8bb939cbcedb503e609d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4a6a37e5193c8bb939cbcedb503e609d" value="False || False" /><br /><div class="answer" id="res4a6a37e5193c8bb939cbcedb503e609d"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
</section>
<section id="pair-patterns" class="level1">
<h1>Pair Patterns</h1>
<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb18-1" data-line-number="1">fst (a, b) <span class="fu">=</span> a</a>
<a class="sourceLine" id="cb18-2" data-line-number="2">snd (a, b) <span class="fu">=</span> b</a></code></pre></div>
<section id="exercise-9" class="level2">
<h2>Exercise</h2>
<p>Define <code>swap</code>!</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">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=FL_FunDef_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=FL_FunDef_en.hs','9bedf586312dc7f1b5d154a7567ce5b2','9bedf586312dc7f1b5d154a7567ce5b2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9bedf586312dc7f1b5d154a7567ce5b2" value="swap (3, &quot;hi&quot;)" /><br /><div class="answer" id="res9bedf586312dc7f1b5d154a7567ce5b2"><code class="result">(&quot;hi&quot;, 3)</code><code> :: </code><code class="type">([Char], Integer)</code></div></form>
</section>
<section id="exercise-10" class="level2">
<h2>Exercise</h2>
<p>Let <code>scale' t</code> be scaling from origin by <code>t</code>.</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">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=FL_FunDef_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=FL_FunDef_en.hs','ac70e38f5632a81d6d648c4627dc75b8','ac70e38f5632a81d6d648c4627dc75b8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaac70e38f5632a81d6d648c4627dc75b8" value="scale' 5 (3, 4)" /><br /><div class="answer" id="resac70e38f5632a81d6d648c4627dc75b8"><code class="result">(15, 20)</code><code> :: </code><code class="type">(Integer, Integer)</code></div></form>
</section>
<section id="exercise-11" class="level2">
<h2>Exercise</h2>
<p>Calculate the distance of two points.</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">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=FL_FunDef_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=FL_FunDef_en.hs','3c26294bf00ce25001a616e87e776410','3c26294bf00ce25001a616e87e776410');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3c26294bf00ce25001a616e87e776410" value="abs (distance (2,-5) (5,-1) - 5) &lt; 0.01" /><br /><div class="answer" id="res3c26294bf00ce25001a616e87e776410"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<p>You can use the absolute value function:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','e21c473885b54c760483dfe5ac6e6bb3','e21c473885b54c760483dfe5ac6e6bb3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae21c473885b54c760483dfe5ac6e6bb3" value="abs :: Num a =&gt; a -&gt; a" /><br /><div class="answer" id="rese21c473885b54c760483dfe5ac6e6bb3"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ee69a24b5ff29753d1abf47373bc9e5b','ee69a24b5ff29753d1abf47373bc9e5b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaee69a24b5ff29753d1abf47373bc9e5b" value="abs (10-50)" /><br /><div class="answer" id="resee69a24b5ff29753d1abf47373bc9e5b"><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=FL_FunDef_en.hs','791aa542f715adbf712102738e3b78e5','791aa542f715adbf712102738e3b78e5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea791aa542f715adbf712102738e3b78e5" value="sqrt :: Floating a =&gt; a -&gt; a" /><br /><div class="answer" id="res791aa542f715adbf712102738e3b78e5"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','666899aa20ffb74817ca85dd50745954','666899aa20ffb74817ca85dd50745954');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea666899aa20ffb74817ca85dd50745954" value="abs (sqrt 2 - 1.41) &lt; 0.01" /><br /><div class="answer" id="res666899aa20ffb74817ca85dd50745954"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-12" class="level2">
<h2>Exercise</h2>
<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="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb23-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=FL_FunDef_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=FL_FunDef_en.hs','1b706c5efaaa6e683c88c492bac4b1ea','1b706c5efaaa6e683c88c492bac4b1ea');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1b706c5efaaa6e683c88c492bac4b1ea" value="2 `mul3` 2" /><br /><div class="answer" id="res1b706c5efaaa6e683c88c492bac4b1ea"><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_FunDef_en.hs','49adc8dc196a7d4b3d9fd67ee1a1a954','49adc8dc196a7d4b3d9fd67ee1a1a954');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea49adc8dc196a7d4b3d9fd67ee1a1a954" value="0 `mul3` 2" /><br /><div class="answer" id="res49adc8dc196a7d4b3d9fd67ee1a1a954"><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_FunDef_en.hs','243bcc9562377e89316e08ec504a13e5','243bcc9562377e89316e08ec504a13e5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea243bcc9562377e89316e08ec504a13e5" value="2 `mul3` 1" /><br /><div class="answer" id="res243bcc9562377e89316e08ec504a13e5"><code class="result">2</code><code> :: </code><code class="type">Int</code></div></form>
</section>
<section id="exercise-13" class="level2">
<h2>Exercise</h2>
<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="cb24"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb24-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=FL_FunDef_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=FL_FunDef_en.hs','29cfac1552279cb0a50eb4fdead7eb92','29cfac1552279cb0a50eb4fdead7eb92');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea29cfac1552279cb0a50eb4fdead7eb92" value="replaceNewline  'x'" /><br /><div class="answer" id="res29cfac1552279cb0a50eb4fdead7eb92"><code class="result">'x'</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','f5dc4f94252123d817034e98f446ba41','f5dc4f94252123d817034e98f446ba41');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf5dc4f94252123d817034e98f446ba41" value="replaceNewline '\n'" /><br /><div class="answer" id="resf5dc4f94252123d817034e98f446ba41"><code class="result">' '</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','5e834880d395f8ef5067becc126a169c','5e834880d395f8ef5067becc126a169c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5e834880d395f8ef5067becc126a169c" value="replaceNewline  'y'" /><br /><div class="answer" id="res5e834880d395f8ef5067becc126a169c"><code class="result">'y'</code><code> :: </code><code class="type">Char</code></div></form>
</section>
<section id="exercise-14" class="level2">
<h2>Exercise</h2>
<p>Define a function that replaces all line breaks with spaces. Use <code>replaceNewline</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="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=FL_FunDef_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=FL_FunDef_en.hs','bf7beec0bab57b90203a8947bc62ab7c','bf7beec0bab57b90203a8947bc62ab7c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareabf7beec0bab57b90203a8947bc62ab7c" value="replaceNewlines &quot;\na b\n c&quot;" /><br /><div class="answer" id="resbf7beec0bab57b90203a8947bc62ab7c"><code class="result">&quot; a b  c&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-15" class="level2">
<h2>Exercise</h2>
<p>Define a function that replaces the words “this” and “that” and vice versa.</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">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=FL_FunDef_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=FL_FunDef_en.hs','e527b6d5b4cf641f608c8bebcd460bc0','e527b6d5b4cf641f608c8bebcd460bc0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae527b6d5b4cf641f608c8bebcd460bc0" value="swapThisAndThat &quot;this&quot;" /><br /><div class="answer" id="rese527b6d5b4cf641f608c8bebcd460bc0"><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=FL_FunDef_en.hs','24f0b2100580101e760e1abb49323217','24f0b2100580101e760e1abb49323217');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea24f0b2100580101e760e1abb49323217" value="swapThisAndThat &quot;that&quot;" /><br /><div class="answer" id="res24f0b2100580101e760e1abb49323217"><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=FL_FunDef_en.hs','b45f92ac7a3b4ba5ba012224f992e114','b45f92ac7a3b4ba5ba012224f992e114');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab45f92ac7a3b4ba5ba012224f992e114" value="swapThisAndThat &quot;thistle&quot;" /><br /><div class="answer" id="resb45f92ac7a3b4ba5ba012224f992e114"><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=FL_FunDef_en.hs','b0c456f7543a577a6d82c0f3a58e1269','b0c456f7543a577a6d82c0f3a58e1269');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab0c456f7543a577a6d82c0f3a58e1269" value="swapThisAndThat &quot;thatch&quot;" /><br /><div class="answer" id="resb0c456f7543a577a6d82c0f3a58e1269"><code class="result">&quot;thatch&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-16" class="level2">
<h2>Exercise</h2>
<p>Define a function that swaps all instances of “this” and “that”.</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">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=FL_FunDef_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=FL_FunDef_en.hs','cf20883badcd9bebc24317635551eec8','cf20883badcd9bebc24317635551eec8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacf20883badcd9bebc24317635551eec8" value="swapAllThisAndThat &quot;this is that word&quot;" /><br /><div class="answer" id="rescf20883badcd9bebc24317635551eec8"><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=FL_FunDef_en.hs','ed646cbb90a1a66b0bee17fd899cc7ca','ed646cbb90a1a66b0bee17fd899cc7ca');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaed646cbb90a1a66b0bee17fd899cc7ca" value="words &quot;this is that apple&quot;" /><br /><div class="answer" id="resed646cbb90a1a66b0bee17fd899cc7ca"><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=FL_FunDef_en.hs','fbfc101208b5100185e72424201dca05','fbfc101208b5100185e72424201dca05');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafbfc101208b5100185e72424201dca05" value="unwords [&quot;this&quot;, &quot;is&quot;, &quot;that&quot;, &quot;apple&quot;]" /><br /><div class="answer" id="resfbfc101208b5100185e72424201dca05"><code class="result">&quot;this is that apple&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
</section>
<section id="list-patterns" class="level1">
<h1>List Patterns</h1>
<p>Empty list pattern: <code>[]</code> Non-empty list pattern: a<code>:</code> b</p>
<p>Other list patterns: <code>[</code>a<code>]</code>, <code>[</code>a<code>,</code> b<code>]</code>, …</p>
<p>Examples:</p>
<div class="sourceCode" id="cb28"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb28-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="cb28-2" data-line-number="2">null [] <span class="fu">=</span> <span class="dt">True</span></a>
<a class="sourceLine" id="cb28-3" data-line-number="3">null _  <span class="fu">=</span> <span class="dt">False</span></a></code></pre></div>
<div class="sourceCode" id="cb29"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb29-1" data-line-number="1">head<span class="ot"> ::</span> [a] <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb29-2" data-line-number="2">head (x<span class="fu">:</span>xs) <span class="fu">=</span> x</a></code></pre></div>
<div class="sourceCode" id="cb30"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb30-1" data-line-number="1">tail<span class="ot"> ::</span> [a] <span class="ot">-&gt;</span> [a]</a>
<a class="sourceLine" id="cb30-2" data-line-number="2">tail (x<span class="fu">:</span>xs) <span class="fu">=</span> xs</a></code></pre></div>
<section id="exercise-17" class="level2">
<h2>Exercise</h2>
<p>Define a function that tests the given list is a singleton one. Use pattern matching.</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="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=FL_FunDef_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=FL_FunDef_en.hs','68c45ad4d254b6d55b1c3bffeb5a6045','68c45ad4d254b6d55b1c3bffeb5a6045');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea68c45ad4d254b6d55b1c3bffeb5a6045" value="not (isSingleton [x | x&lt;-[1..5], odd x])" /><br /><div class="answer" id="res68c45ad4d254b6d55b1c3bffeb5a6045"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-18" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>sum</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">sum<span class="ot"> ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</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=FL_FunDef_en_5b5cc650c9d4ff27927c06b1f01f1147.hs','5b5cc650c9d4ff27927c06b1f01f1147','5b5cc650c9d4ff27927c06b1f01f1147');"><textarea cols="80" rows="4" id="tarea5b5cc650c9d4ff27927c06b1f01f1147"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res5b5cc650c9d4ff27927c06b1f01f1147"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7f523409e78c028bf9790c60e8d1d332','7f523409e78c028bf9790c60e8d1d332');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7f523409e78c028bf9790c60e8d1d332" value="sum []" /><br /><div class="answer" id="res7f523409e78c028bf9790c60e8d1d332"><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_FunDef_en.hs','a2f210d7d9e05d7ba384cffbcbc76020','a2f210d7d9e05d7ba384cffbcbc76020');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa2f210d7d9e05d7ba384cffbcbc76020" value="sum [1,2,4]" /><br /><div class="answer" id="resa2f210d7d9e05d7ba384cffbcbc76020"><code class="result">7</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-19" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>Prelude.last</code>, which returns the last element of a list!</p>
<div class="sourceCode" id="cb33"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb33-1" data-line-number="1">last<span class="ot"> ::</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=FL_FunDef_en_46254a0bc2333904fd641faaeda92e0c.hs','46254a0bc2333904fd641faaeda92e0c','46254a0bc2333904fd641faaeda92e0c');"><textarea cols="80" rows="4" id="tarea46254a0bc2333904fd641faaeda92e0c"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res46254a0bc2333904fd641faaeda92e0c"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','13d53da88473f4f507d89be357b23837','13d53da88473f4f507d89be357b23837');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea13d53da88473f4f507d89be357b23837" value="last &quot;last&quot;" /><br /><div class="answer" id="res13d53da88473f4f507d89be357b23837"><code class="result">'t'</code><code> :: </code><code class="type">Char</code></div></form>
</section>
<section id="exercise-20" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>Prelude.init</code>, which returns all but the last element of a list!</p>
<div class="sourceCode" id="cb34"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb34-1" data-line-number="1">init<span class="ot"> ::</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=FL_FunDef_en_49ddd00e23dccf8d5b1583b742fbedb7.hs','49ddd00e23dccf8d5b1583b742fbedb7','49ddd00e23dccf8d5b1583b742fbedb7');"><textarea cols="80" rows="4" id="tarea49ddd00e23dccf8d5b1583b742fbedb7"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res49ddd00e23dccf8d5b1583b742fbedb7"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','20f7e4cc7457a06c98e92e1a234e7735','20f7e4cc7457a06c98e92e1a234e7735');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea20f7e4cc7457a06c98e92e1a234e7735" value="init &quot;last&quot;" /><br /><div class="answer" id="res20f7e4cc7457a06c98e92e1a234e7735"><code class="result">&quot;las&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
</section>
<section id="guards" class="level1">
<h1>Guards</h1>
<p><img src="FL_FunDef_en311d942d1f438346889ce826292ee64b.png" alt="FL_FunDef_en311d942d1f438346889ce826292ee64b.png" /></p>
<div class="sourceCode" id="cb35"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb35-1" data-line-number="1">min x y</a>
<a class="sourceLine" id="cb35-2" data-line-number="2">    <span class="fu">|</span> x <span class="fu">&lt;=</span> y    <span class="fu">=</span>  x</a>
<a class="sourceLine" id="cb35-3" data-line-number="3">    <span class="fu">|</span> otherwise <span class="fu">=</span>  y</a></code></pre></div>
<p>This is equivalent to:</p>
<div class="sourceCode" id="cb36"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb36-1" data-line-number="1">min x y</a>
<a class="sourceLine" id="cb36-2" data-line-number="2">    <span class="fu">|</span> x <span class="fu">&lt;=</span> y    <span class="fu">=</span>  x</a>
<a class="sourceLine" id="cb36-3" data-line-number="3">min _ y         <span class="fu">=</span>  y</a></code></pre></div>
<section id="exercise-21" class="level2">
<h2>Exercise</h2>
<p>Make a lowercase letter uppercase and an uppercase letter lowercase with the <code>upperLower</code> function.</p>
<p>Hint. Use <code>isUpper</code>, <code>isLower</code>, <code>toUpper</code>, <code>toLower</code>.</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="ot">upperLower ::</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=FL_FunDef_en_e66f315c945bc766d7c105f90aed0bcd.hs','e66f315c945bc766d7c105f90aed0bcd','e66f315c945bc766d7c105f90aed0bcd');"><textarea cols="80" rows="6" id="tareae66f315c945bc766d7c105f90aed0bcd"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese66f315c945bc766d7c105f90aed0bcd"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','a150e6ebce87984fff073383071ebe81','a150e6ebce87984fff073383071ebe81');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa150e6ebce87984fff073383071ebe81" value="upperLower 'a'" /><br /><div class="answer" id="resa150e6ebce87984fff073383071ebe81"><code class="result">'A'</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','cb698cd8f9fad41da07a3ed0192eb3c4','cb698cd8f9fad41da07a3ed0192eb3c4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacb698cd8f9fad41da07a3ed0192eb3c4" value="upperLower 'T'" /><br /><div class="answer" id="rescb698cd8f9fad41da07a3ed0192eb3c4"><code class="result">'t'</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ef6fd0e1a8881a88de74efbab37c8803','ef6fd0e1a8881a88de74efbab37c8803');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaef6fd0e1a8881a88de74efbab37c8803" value="upperLower ','" /><br /><div class="answer" id="resef6fd0e1a8881a88de74efbab37c8803"><code class="result">','</code><code> :: </code><code class="type">Char</code></div></form>
</section>
</section>
<section id="fast-exponentiation" class="level1">
<h1>Fast Exponentiation</h1>
<p>Let <code>sqr</code> be the squaring function:</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="ot">sqr ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> a</a>
<a class="sourceLine" id="cb38-2" data-line-number="2">sqr x <span class="fu">=</span> x <span class="fu">*</span> x</a></code></pre></div>
<p>Redefine the <code>(^)</code> operator!</p>
<p><img src="FL_FunDef_en2c3663a02c9df0ae41f797c985af4b9a.png" alt="FL_FunDef_en2c3663a02c9df0ae41f797c985af4b9a.png" /></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">(^) ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_6a72e500952a488e35ce2d3e52a49fd6.hs','6a72e500952a488e35ce2d3e52a49fd6','6a72e500952a488e35ce2d3e52a49fd6');"><textarea cols="80" rows="6" id="tarea6a72e500952a488e35ce2d3e52a49fd6"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res6a72e500952a488e35ce2d3e52a49fd6"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','3b57e4eb491222273647cdb4d0a349b1','3b57e4eb491222273647cdb4d0a349b1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3b57e4eb491222273647cdb4d0a349b1" value="3 ^ 0" /><br /><div class="answer" id="res3b57e4eb491222273647cdb4d0a349b1"><code class="result">1</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b16ac44528047d81e7c9fbc1fa5fed62','b16ac44528047d81e7c9fbc1fa5fed62');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab16ac44528047d81e7c9fbc1fa5fed62" value="3 ^ 3" /><br /><div class="answer" id="resb16ac44528047d81e7c9fbc1fa5fed62"><code class="result">27</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c6930062a912a5c7b3e72422a1d5f360','c6930062a912a5c7b3e72422a1d5f360');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac6930062a912a5c7b3e72422a1d5f360" value="1.0000001 ^ 10000000 &gt; 2.718" /><br /><div class="answer" id="resc6930062a912a5c7b3e72422a1d5f360"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="pattern-matching-with-guards" class="level1">
<h1>Pattern Matching with Guards</h1>
<p>Definition of <code>drop</code>:</p>
<div class="sourceCode" id="cb40"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb40-1" data-line-number="1">drop<span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [a]</a>
<a class="sourceLine" id="cb40-2" data-line-number="2">drop  n  l  <span class="fu">|</span> n <span class="fu">&lt;=</span> <span class="dv">0</span>  <span class="fu">=</span> l</a>
<a class="sourceLine" id="cb40-3" data-line-number="3">drop  n  []           <span class="fu">=</span> []</a>
<a class="sourceLine" id="cb40-4" data-line-number="4">drop  n  (x<span class="fu">:</span>xs)       <span class="fu">=</span> drop (n<span class="fu">-</span><span class="dv">1</span>) xs</a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','0ba8bbe54f90caa87de628e44436dbec','0ba8bbe54f90caa87de628e44436dbec');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0ba8bbe54f90caa87de628e44436dbec" value="drop   3  [1..10]" /><br /><div class="answer" id="res0ba8bbe54f90caa87de628e44436dbec"><code class="result">[4, 5, 6, 7, 8, 9, 10]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','46249d4babab653948395745b8653b8d','46249d4babab653948395745b8653b8d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea46249d4babab653948395745b8653b8d" value="drop   3  [1,2]" /><br /><div class="answer" id="res46249d4babab653948395745b8653b8d"><code class="result">[]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c5b130f7c5f87a47c86f7029c5d09414','c5b130f7c5f87a47c86f7029c5d09414');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac5b130f7c5f87a47c86f7029c5d09414" value="drop (-1) [1,2]" /><br /><div class="answer" id="resc5b130f7c5f87a47c86f7029c5d09414"><code class="result">[1, 2]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<section id="exercise-22" class="level2">
<h2>Exercise</h2>
<p>Redefined <code>Prelude.take</code>, which returns the first n elements of a list.</p>
<div class="sourceCode" id="cb41"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb41-1" data-line-number="1">take<span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</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=FL_FunDef_en_48e0f3782714ec965f08ce0143ac365b.hs','48e0f3782714ec965f08ce0143ac365b','48e0f3782714ec965f08ce0143ac365b');"><textarea cols="80" rows="5" id="tarea48e0f3782714ec965f08ce0143ac365b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res48e0f3782714ec965f08ce0143ac365b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','dce128682a3ca6b9c3afb6a9a619576a','dce128682a3ca6b9c3afb6a9a619576a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadce128682a3ca6b9c3afb6a9a619576a" value="take   3  [1..10]" /><br /><div class="answer" id="resdce128682a3ca6b9c3afb6a9a619576a"><code class="result">[1, 2, 3]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','3e2f954a72367c3dd2b1638f9112eac9','3e2f954a72367c3dd2b1638f9112eac9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3e2f954a72367c3dd2b1638f9112eac9" value="take   3  [1,2]" /><br /><div class="answer" id="res3e2f954a72367c3dd2b1638f9112eac9"><code class="result">[1, 2]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b24a683bcb1dd94e31522a5f66b55c23','b24a683bcb1dd94e31522a5f66b55c23');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab24a683bcb1dd94e31522a5f66b55c23" value="take (-1) [1,2]" /><br /><div class="answer" id="resb24a683bcb1dd94e31522a5f66b55c23"><code class="result">[]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
</section>
<section id="local-definitions" class="level1">
<h1>Local Definitions</h1>
<p>Example with <em>bindings</em>:</p>
<div class="sourceCode" id="cb42"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb42-1" data-line-number="1">unzip<span class="ot"> ::</span> [(a, b)] <span class="ot">-&gt;</span> ([a], [b])</a>
<a class="sourceLine" id="cb42-2" data-line-number="2">unzip [] <span class="fu">=</span> ([], [])</a>
<a class="sourceLine" id="cb42-3" data-line-number="3">unzip ((a, b)<span class="fu">:</span> xs) <span class="fu">=</span> (a<span class="fu">:</span>as, b<span class="fu">:</span>bs)</a>
<a class="sourceLine" id="cb42-4" data-line-number="4">   <span class="kw">where</span> (as, bs) <span class="fu">=</span> unzip xs</a></code></pre></div>
<section id="exercise-23" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>Prelude.splitAt</code> which splits a list at the <span class="math inline"><em>n</em></span>th position!</p>
<div class="sourceCode" id="cb43"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb43-1" data-line-number="1">splitAt<span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> [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=FL_FunDef_en_fa9cb5ab7bedd852172da53926afe164.hs','fa9cb5ab7bedd852172da53926afe164','fa9cb5ab7bedd852172da53926afe164');"><textarea cols="80" rows="6" id="tareafa9cb5ab7bedd852172da53926afe164"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resfa9cb5ab7bedd852172da53926afe164"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','4e7e5648c21fe6983328086a029ddf46','4e7e5648c21fe6983328086a029ddf46');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4e7e5648c21fe6983328086a029ddf46" value="splitAt   3  [1..9]" /><br /><div class="answer" id="res4e7e5648c21fe6983328086a029ddf46"><code class="result">([1, 2, 3], [4, 5, 6, 7, 8, 9])</code><code> :: </code><code class="type">([Integer], [Integer])</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','975298cdbe62f1596e3d57358647eb90','975298cdbe62f1596e3d57358647eb90');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea975298cdbe62f1596e3d57358647eb90" value="splitAt (-1) [1..9]" /><br /><div class="answer" id="res975298cdbe62f1596e3d57358647eb90"><code class="result">([], [1, 2, 3, 4, 5, 6, 7, 8, 9])</code><code> :: </code><code class="type">([Integer], [Integer])</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','82761941b7a69c51ec5ffb9526f43bbc','82761941b7a69c51ec5ffb9526f43bbc');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea82761941b7a69c51ec5ffb9526f43bbc" value="splitAt  11  [1..9]" /><br /><div class="answer" id="res82761941b7a69c51ec5ffb9526f43bbc"><code class="result">([1, 2, 3, 4, 5, 6, 7, 8, 9], [])</code><code> :: </code><code class="type">([Integer], [Integer])</code></div></form>
</section>
</section>
<section id="sections" class="level1">
<h1>Sections</h1>
<p>Sections are functions made from operators: <code>(&lt;3)</code>, <code>(^2)</code>, <code>(4*)</code>.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c76756750c915a0f8baccd9976024144','c76756750c915a0f8baccd9976024144');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac76756750c915a0f8baccd9976024144" value="(^2) 3" /><br /><div class="answer" id="resc76756750c915a0f8baccd9976024144"><code class="result">9</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','49cb77783b9216340e7d4f8a16d67d49','49cb77783b9216340e7d4f8a16d67d49');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea49cb77783b9216340e7d4f8a16d67d49" value="(2^) 3" /><br /><div class="answer" id="res49cb77783b9216340e7d4f8a16d67d49"><code class="result">8</code><code> :: </code><code class="type">Integer</code></div></form>
<p>Note: Use <code>(+(-4))</code> instead of <code>(-4)</code> which is a literal.</p>
</section>
<section id="higher-order-functions" class="level1">
<h1>Higher-Order Functions</h1>
<p>A higher-order function is a function that takes another function as a parameter. Here is a trivial example:</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="ot">twice ::</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</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=FL_FunDef_en_10caed157f340be47b49235e491a57aa.hs','10caed157f340be47b49235e491a57aa','10caed157f340be47b49235e491a57aa');"><textarea cols="80" rows="3" id="tarea10caed157f340be47b49235e491a57aa"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res10caed157f340be47b49235e491a57aa"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1a9eb8674e929632f7f91efbd42b3135','1a9eb8674e929632f7f91efbd42b3135');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1a9eb8674e929632f7f91efbd42b3135" value="twice (+1) 5" /><br /><div class="answer" id="res1a9eb8674e929632f7f91efbd42b3135"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','72d592cd1f7c6d08bbeae45c6318dc0d','72d592cd1f7c6d08bbeae45c6318dc0d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea72d592cd1f7c6d08bbeae45c6318dc0d" value="twice tail &quot;Hello&quot;" /><br /><div class="answer" id="res72d592cd1f7c6d08bbeae45c6318dc0d"></div></form>
<p>A better example:</p>
<div class="sourceCode" id="cb45"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb45-1" data-line-number="1">map<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [b]</a>
<a class="sourceLine" id="cb45-2" data-line-number="2">map f [] <span class="fu">=</span> []</a>
<a class="sourceLine" id="cb45-3" data-line-number="3">map f (x<span class="fu">:</span>xs) <span class="fu">=</span> f x<span class="fu">:</span> map f xs</a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','526d606b78bf0f0492b438cc3f628065','526d606b78bf0f0492b438cc3f628065');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea526d606b78bf0f0492b438cc3f628065" value="map (+1)      [1..5]" /><br /><div class="answer" id="res526d606b78bf0f0492b438cc3f628065"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','f6d8714468a46ee864746a2ab3ac42cd','f6d8714468a46ee864746a2ab3ac42cd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf6d8714468a46ee864746a2ab3ac42cd" value="map (^2)      [1..5]" /><br /><div class="answer" id="resf6d8714468a46ee864746a2ab3ac42cd"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','022ba4329c83f232ff9058e4766742e1','022ba4329c83f232ff9058e4766742e1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea022ba4329c83f232ff9058e4766742e1" value="map (2^)      [1..5]" /><br /><div class="answer" id="res022ba4329c83f232ff9058e4766742e1"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','2a04101afa254cb6c749bb77b0cdbea7','2a04101afa254cb6c749bb77b0cdbea7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a04101afa254cb6c749bb77b0cdbea7" value="map (`mod` 2) [1..5]" /><br /><div class="answer" id="res2a04101afa254cb6c749bb77b0cdbea7"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1b34cce26ab7c9d7b0d00d6c88a991d3','1b34cce26ab7c9d7b0d00d6c88a991d3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1b34cce26ab7c9d7b0d00d6c88a991d3" value="map even [1..5]" /><br /><div class="answer" id="res1b34cce26ab7c9d7b0d00d6c88a991d3"></div></form>
<p>Another example:</p>
<div class="sourceCode" id="cb46"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb46-1" data-line-number="1">filter<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</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=FL_FunDef_en_f932d680f654261139c024eeeca81ece.hs','f932d680f654261139c024eeeca81ece','f932d680f654261139c024eeeca81ece');"><textarea cols="80" rows="6" id="tareaf932d680f654261139c024eeeca81ece"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf932d680f654261139c024eeeca81ece"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','de793ec59178dfe3be39ed3ca33212f9','de793ec59178dfe3be39ed3ca33212f9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareade793ec59178dfe3be39ed3ca33212f9" value="filter even [1..10]" /><br /><div class="answer" id="resde793ec59178dfe3be39ed3ca33212f9"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','5fbca7c2112426dcd65acd8b84ded1f5','5fbca7c2112426dcd65acd8b84ded1f5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5fbca7c2112426dcd65acd8b84ded1f5" value="filter (4&lt;) [1..10]" /><br /><div class="answer" id="res5fbca7c2112426dcd65acd8b84ded1f5"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','f70df90d7fe354c517d3f158c67d62e9','f70df90d7fe354c517d3f158c67d62e9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf70df90d7fe354c517d3f158c67d62e9" value="filter (&lt;4) [1..10]" /><br /><div class="answer" id="resf70df90d7fe354c517d3f158c67d62e9"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','95c2fece8bd7eb39f94daed9b35b4b59','95c2fece8bd7eb39f94daed9b35b4b59');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea95c2fece8bd7eb39f94daed9b35b4b59" value="filter (/= 3) [1,2,3,4,5,4,3,2,1]" /><br /><div class="answer" id="res95c2fece8bd7eb39f94daed9b35b4b59"></div></form>
<section id="exercise-24" class="level2">
<h2>Exercise</h2>
<p>Define <code>count</code> which counts elements with a given property.</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">count ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</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_FunDef_en_e02929cdc58bad651c10fb3a3cf49bd8.hs','e02929cdc58bad651c10fb3a3cf49bd8','e02929cdc58bad651c10fb3a3cf49bd8');"><textarea cols="80" rows="3" id="tareae02929cdc58bad651c10fb3a3cf49bd8"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese02929cdc58bad651c10fb3a3cf49bd8"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','21c645ff3848b4097b9cfc96a27cf938','21c645ff3848b4097b9cfc96a27cf938');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea21c645ff3848b4097b9cfc96a27cf938" value="count (==3) [1,2,3,4,5,4,3,2,1]" /><br /><div class="answer" id="res21c645ff3848b4097b9cfc96a27cf938"><code class="result">2</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','74b5f219e8b80cae82db5051bf4a40cb','74b5f219e8b80cae82db5051bf4a40cb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea74b5f219e8b80cae82db5051bf4a40cb" value="count (&quot;apple&quot; `isPrefixOf`) (words &quot;appletree apple applepie app&quot;)" /><br /><div class="answer" id="res74b5f219e8b80cae82db5051bf4a40cb"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
<p>Redefine <code>Prelude.takeWhile</code> which returns the longest prefix (possibly empty) of the given list of elements that satisfy the given property.</p>
<div class="sourceCode" id="cb48"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb48-1" data-line-number="1">takeWhile<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</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=FL_FunDef_en_9ad872702f8d7b3c18c283ed3bb2c232.hs','9ad872702f8d7b3c18c283ed3bb2c232','9ad872702f8d7b3c18c283ed3bb2c232');"><textarea cols="80" rows="4" id="tarea9ad872702f8d7b3c18c283ed3bb2c232"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res9ad872702f8d7b3c18c283ed3bb2c232"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','411802b439054ec1a17bc16f78b07a53','411802b439054ec1a17bc16f78b07a53');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea411802b439054ec1a17bc16f78b07a53" value="takeWhile (&lt;5) [1,2,3,4,5,6,5,4,3,2]" /><br /><div class="answer" id="res411802b439054ec1a17bc16f78b07a53"><code class="result">[1, 2, 3, 4]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','00dfdac66b56e433a544c9047daf8903','00dfdac66b56e433a544c9047daf8903');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea00dfdac66b56e433a544c9047daf8903" value="takeWhile (&lt;500) (map (^2) [1..])" /><br /><div class="answer" id="res00dfdac66b56e433a544c9047daf8903"><code class="result">[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225,
 256, 289, 324, 361, 400, 441, 484]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-25" class="level2">
<h2>Exercise</h2>
<p>Redefine the universal quantification (<code>Prelude.all</code>).</p>
<div class="sourceCode" id="cb49"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb49-1" data-line-number="1">all<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</span> [a]<span class="co">{-finite-}</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_FunDef_en_b0497ce123f2166956e633c57b9bc0d5.hs','b0497ce123f2166956e633c57b9bc0d5','b0497ce123f2166956e633c57b9bc0d5');"><textarea cols="80" rows="3" id="tareab0497ce123f2166956e633c57b9bc0d5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb0497ce123f2166956e633c57b9bc0d5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b002f63394d5b8128a16ae190d280e7b','b002f63394d5b8128a16ae190d280e7b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab002f63394d5b8128a16ae190d280e7b" value="all even [2,4..10]" /><br /><div class="answer" id="resb002f63394d5b8128a16ae190d280e7b"><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_FunDef_en.hs','0fbb1639fd9086d40afeb2b97555a658','0fbb1639fd9086d40afeb2b97555a658');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0fbb1639fd9086d40afeb2b97555a658" value="not $ all even [1..10]" /><br /><div class="answer" id="res0fbb1639fd9086d40afeb2b97555a658"><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_FunDef_en.hs','54a4d318612cbc0f7971fde2892f34b2','54a4d318612cbc0f7971fde2892f34b2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea54a4d318612cbc0f7971fde2892f34b2" value="not $ all even [1,3..10]" /><br /><div class="answer" id="res54a4d318612cbc0f7971fde2892f34b2"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-26" class="level2">
<h2>Exercise</h2>
<p>Redefine the existential quantification (<code>Prelude.any</code>).</p>
<div class="sourceCode" id="cb50"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb50-1" data-line-number="1">any<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</span> [a]<span class="co">{-finite-}</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_FunDef_en_9cd6e09bd920df3e558c2487dac3e9b7.hs','9cd6e09bd920df3e558c2487dac3e9b7','9cd6e09bd920df3e558c2487dac3e9b7');"><textarea cols="80" rows="3" id="tarea9cd6e09bd920df3e558c2487dac3e9b7"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res9cd6e09bd920df3e558c2487dac3e9b7"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','8bd94e10c116b93d826e6ba3cdc6d164','8bd94e10c116b93d826e6ba3cdc6d164');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8bd94e10c116b93d826e6ba3cdc6d164" value="any even [1..10]" /><br /><div class="answer" id="res8bd94e10c116b93d826e6ba3cdc6d164"><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_FunDef_en.hs','4e25e9187aa0108c75ae3cd7f193f63e','4e25e9187aa0108c75ae3cd7f193f63e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4e25e9187aa0108c75ae3cd7f193f63e" value="not $ any even [1,3..10]" /><br /><div class="answer" id="res4e25e9187aa0108c75ae3cd7f193f63e"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-27" class="level2">
<h2>Exercise</h2>
<p>Define the membership function (with the help of <code>any</code>) that determines if an element is member of a list.</p>
<div class="sourceCode" id="cb51"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb51-1" data-line-number="1">elem<span class="ot"> ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> [a]<span class="co">{-finite-}</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_FunDef_en_460fd8107c1462d157089ba4c15e62ec.hs','460fd8107c1462d157089ba4c15e62ec','460fd8107c1462d157089ba4c15e62ec');"><textarea cols="80" rows="3" id="tarea460fd8107c1462d157089ba4c15e62ec"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res460fd8107c1462d157089ba4c15e62ec"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b4297d2aea4d2f4ae9b199601ee9ce1c','b4297d2aea4d2f4ae9b199601ee9ce1c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab4297d2aea4d2f4ae9b199601ee9ce1c" value="elem 1 [1..10]" /><br /><div class="answer" id="resb4297d2aea4d2f4ae9b199601ee9ce1c"><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_FunDef_en.hs','b7e9b9bffd8b00395e7690cc78ee216b','b7e9b9bffd8b00395e7690cc78ee216b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab7e9b9bffd8b00395e7690cc78ee216b" value="not $ elem 0 [1..10]" /><br /><div class="answer" id="resb7e9b9bffd8b00395e7690cc78ee216b"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-28" class="level2">
<h2>Exercise</h2>
<p>Redefine the <code>Prelude.zipWith</code> function.</p>
<div class="sourceCode" id="cb52"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb52-1" data-line-number="1">zipWith<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> c) <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [b] <span class="ot">-&gt;</span> [c]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_f68046b55d1dbc1e2d991ca3f48c8d32.hs','f68046b55d1dbc1e2d991ca3f48c8d32','f68046b55d1dbc1e2d991ca3f48c8d32');"><textarea cols="80" rows="4" id="tareaf68046b55d1dbc1e2d991ca3f48c8d32"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf68046b55d1dbc1e2d991ca3f48c8d32"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','2b63d2cf63e48d930b72d5890e5def7b','2b63d2cf63e48d930b72d5890e5def7b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2b63d2cf63e48d930b72d5890e5def7b" value="zipWith (+) [1,2,3,4,5] [5,6,7,8]" /><br /><div class="answer" id="res2b63d2cf63e48d930b72d5890e5def7b"><code class="result">[6, 8, 10, 12]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','e74b2fa2c2dd38e5ecbaa6180a51d9bc','e74b2fa2c2dd38e5ecbaa6180a51d9bc');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae74b2fa2c2dd38e5ecbaa6180a51d9bc" value="zipWith (,) [1,2,3] &quot;hello&quot;" /><br /><div class="answer" id="rese74b2fa2c2dd38e5ecbaa6180a51d9bc"><code class="result">[(1, 'h'), (2, 'e'), (3, 'l')]</code><code> :: </code><code class="type">[(Integer, Char)]</code></div></form>
<div class="handout">
<hr />
<p>Note that the constructor for pairs is as follows.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b157f5ede13edb48e67535e6f0929d20','b157f5ede13edb48e67535e6f0929d20');"><div class="answer" id="resb157f5ede13edb48e67535e6f0929d20"><code class="result">(,)</code><code> :: </code><code class="type">a -&gt; b -&gt; (a, b)</code></div></form>
<p>Therefore it is possible to write <code>(,) 2 'c'</code>, but instead we often use the form <code>(2,'c')</code>. Although, sometimes the <code>(,)</code> notation is definitely useful. For example, here is an alternative definition for the <code>zip</code> function.</p>
<div class="sourceCode" id="cb53"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb53-1" data-line-number="1">zip <span class="fu">=</span> zipWith (,)</a></code></pre></div>
</div>
</section>
<section id="exercise-29" class="level2">
<h2>Exercise</h2>
<p>With the use of <code>zipWith</code>, implement a function that produces the sequence of pairwise differences of elements for a list.</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">differences ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</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=FL_FunDef_en_1bb008b4d23d2c3026547c4e1324f763.hs','1bb008b4d23d2c3026547c4e1324f763','1bb008b4d23d2c3026547c4e1324f763');"><textarea cols="80" rows="3" id="tarea1bb008b4d23d2c3026547c4e1324f763"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1bb008b4d23d2c3026547c4e1324f763"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','89231a012cdc26c147cfc7968eac3280','89231a012cdc26c147cfc7968eac3280');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea89231a012cdc26c147cfc7968eac3280" value="differences [1..5]" /><br /><div class="answer" id="res89231a012cdc26c147cfc7968eac3280"><code class="result">[1, 1, 1, 1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','e724de33891bd5df6a7a8f16a6aa3f59','e724de33891bd5df6a7a8f16a6aa3f59');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae724de33891bd5df6a7a8f16a6aa3f59" value="differences [5,4..1]" /><br /><div class="answer" id="rese724de33891bd5df6a7a8f16a6aa3f59"><code class="result">[-1, -1, -1, -1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d65c3e537a422eaa87ff49f7b3f70143','d65c3e537a422eaa87ff49f7b3f70143');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread65c3e537a422eaa87ff49f7b3f70143" value="differences [0,1,4,9,16]" /><br /><div class="answer" id="resd65c3e537a422eaa87ff49f7b3f70143"><code class="result">[1, 3, 5, 7]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-30" class="level2">
<h2>Exercise</h2>
<p>Redefine the <code>Prelude.span</code> function that could be expressed in the following way:</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 p xs <span class="fu">=</span> (takeWhile p xs, dropWhile p xs)</a></code></pre></div>
<p>Implement this function in a more efficient manner.</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<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</span> [a]<span class="co">{-finite-}</span> <span class="ot">-&gt;</span> ([a],[a])</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_6463561461a76eacebf0671eedb72d82.hs','6463561461a76eacebf0671eedb72d82','6463561461a76eacebf0671eedb72d82');"><textarea cols="80" rows="7" id="tarea6463561461a76eacebf0671eedb72d82"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res6463561461a76eacebf0671eedb72d82"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','409fc39814534630b13edee18c36c018','409fc39814534630b13edee18c36c018');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea409fc39814534630b13edee18c36c018" value="span (&lt; 3) [1,2,3,4,1,2,3,4]" /><br /><div class="answer" id="res409fc39814534630b13edee18c36c018"><code class="result">([1, 2], [3, 4, 1, 2, 3, 4])</code><code> :: </code><code class="type">([Integer], [Integer])</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7c8444852b375d30a9ac1fb51bb7a4be','7c8444852b375d30a9ac1fb51bb7a4be');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7c8444852b375d30a9ac1fb51bb7a4be" value="span (&lt; 9) [1,2,3]" /><br /><div class="answer" id="res7c8444852b375d30a9ac1fb51bb7a4be"><code class="result">([1, 2, 3], [])</code><code> :: </code><code class="type">([Integer], [Integer])</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','4f862650eec66fae00b3974419daaff5','4f862650eec66fae00b3974419daaff5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4f862650eec66fae00b3974419daaff5" value="span (&lt; 0) [1,2,3]" /><br /><div class="answer" id="res4f862650eec66fae00b3974419daaff5"><code class="result">([], [1, 2, 3])</code><code> :: </code><code class="type">([Integer], [Integer])</code></div></form>
</section>
<section id="exercise-31" class="level2">
<h2>Exercise</h2>
<p>Implement the <code>Data.List.group</code> function. This function splits a list into smaller sections that all contains equivalent elements.</p>
<div class="sourceCode" id="cb57"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb57-1" data-line-number="1">group<span class="ot"> ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> [a]<span class="co">{-finite-}</span> <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_e75cb0852406e516163b077c1e83eb51.hs','e75cb0852406e516163b077c1e83eb51','e75cb0852406e516163b077c1e83eb51');"><textarea cols="80" rows="5" id="tareae75cb0852406e516163b077c1e83eb51"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese75cb0852406e516163b077c1e83eb51"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','cc65275229ddcb4bbca2b480c61c5fb2','cc65275229ddcb4bbca2b480c61c5fb2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacc65275229ddcb4bbca2b480c61c5fb2" value="group [1..10]" /><br /><div class="answer" id="rescc65275229ddcb4bbca2b480c61c5fb2"><code class="result">[[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1bca94e077e9aea8201afc7b711bb77e','1bca94e077e9aea8201afc7b711bb77e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1bca94e077e9aea8201afc7b711bb77e" value="group [True,True,True,True]" /><br /><div class="answer" id="res1bca94e077e9aea8201afc7b711bb77e"><code class="result">[[True, True, True, True]]</code><code> :: </code><code class="type">[[Bool]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','426df0cb0c520e2f97f24eaa1a1376d7','426df0cb0c520e2f97f24eaa1a1376d7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea426df0cb0c520e2f97f24eaa1a1376d7" value="group &quot;Mississippi&quot;" /><br /><div class="answer" id="res426df0cb0c520e2f97f24eaa1a1376d7"><code class="result">[&quot;M&quot;, &quot;i&quot;, &quot;ss&quot;, &quot;i&quot;, &quot;ss&quot;, &quot;i&quot;, &quot;pp&quot;, &quot;i&quot;]</code><code> :: </code><code class="type">[[Char]]</code></div></form>
<p><em>Hint.</em> Use the <code>span</code> function.</p>
</section>
<section id="exercise-32" class="level2">
<h2>Exercise</h2>
<p>Define the <code>compress</code> function that finds all repeated elements in a list and packs them together with the number of their occurences as pairs.</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">compress ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> [(<span class="dt">Int</span>,a)]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_402cc01b33f53f51c91a18f4a9bb337e.hs','402cc01b33f53f51c91a18f4a9bb337e','402cc01b33f53f51c91a18f4a9bb337e');"><textarea cols="80" rows="3" id="tarea402cc01b33f53f51c91a18f4a9bb337e"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res402cc01b33f53f51c91a18f4a9bb337e"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','0ea65bf26c7d94c68ea87b53f26311c7','0ea65bf26c7d94c68ea87b53f26311c7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0ea65bf26c7d94c68ea87b53f26311c7" value="compress &quot;abbccccb&quot;" /><br /><div class="answer" id="res0ea65bf26c7d94c68ea87b53f26311c7"><code class="result">[(1, 'a'), (2, 'b'), (4, 'c'), (1, 'b')]</code><code> :: </code><code class="type">[(Int, Char)]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ce23f59ae6cba28200090d935070f8bd','ce23f59ae6cba28200090d935070f8bd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareace23f59ae6cba28200090d935070f8bd" value="compress (sort &quot;abrakadabra&quot;)" /><br /><div class="answer" id="resce23f59ae6cba28200090d935070f8bd"><code class="result">[(5, 'a'), (2, 'b'), (1, 'd'), (1, 'k'), (2, 'r')]</code><code> :: </code><code class="type">[(Int, Char)]</code></div></form>
<p><em>Hint.</em> Use the <code>group</code> function.</p>
</section>
<section id="exercise-33" class="level2">
<h2>Exercise</h2>
<p>Redefine the <code>Prelude.uncurry</code> function that translates a two-parameter function to a function that operates on pairs.</p>
<div class="sourceCode" id="cb59"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb59-1" data-line-number="1">uncurry<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> c) <span class="ot">-&gt;</span> ((a, b) <span class="ot">-&gt;</span> c)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_8651500bd14543d43c5971e7b72d03e8.hs','8651500bd14543d43c5971e7b72d03e8','8651500bd14543d43c5971e7b72d03e8');"><textarea cols="80" rows="3" id="tarea8651500bd14543d43c5971e7b72d03e8"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res8651500bd14543d43c5971e7b72d03e8"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','2b951d43eeb6baa58076417218b56a30','2b951d43eeb6baa58076417218b56a30');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2b951d43eeb6baa58076417218b56a30" value="uncurry replicate (2,'a')" /><br /><div class="answer" id="res2b951d43eeb6baa58076417218b56a30"><code class="result">&quot;aa&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p><em>Remark.</em> The inverse operation is the <code>Prelude.curry</code> function.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1afe22439bbad9bcaa2affdd6f9ff6ae','1afe22439bbad9bcaa2affdd6f9ff6ae');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1afe22439bbad9bcaa2affdd6f9ff6ae" value=":t curry" /><br /><div class="answer" id="res1afe22439bbad9bcaa2affdd6f9ff6ae"><code class="result">curry</code><code> :: </code><code class="type">((a, b) -&gt; c) -&gt; a -&gt; b -&gt; c</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','fc383aea6fdde48772a7a471c2fd18a9','fc383aea6fdde48772a7a471c2fd18a9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafc383aea6fdde48772a7a471c2fd18a9" value=":t curry (uncurry (+))" /><br /><div class="answer" id="resfc383aea6fdde48772a7a471c2fd18a9"><code class="result">curry (uncurry (+))</code><code> :: </code><code class="type">Num c =&gt; c -&gt; c -&gt; c</code></div></form>
</section>
<section id="exercise-34" class="level2">
<h2>Exercise</h2>
<p>Define <code>decompress</code>, the inverse operation for the previously defined <code>compress</code> function. This is to unpack the list of pairs containing elements associated with the number of their occurences into an uncompressed list.</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">decompress ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> [(<span class="dt">Int</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=FL_FunDef_en_1e062bbd8a2f7f18968b71a4b6f03923.hs','1e062bbd8a2f7f18968b71a4b6f03923','1e062bbd8a2f7f18968b71a4b6f03923');"><textarea cols="80" rows="3" id="tarea1e062bbd8a2f7f18968b71a4b6f03923"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1e062bbd8a2f7f18968b71a4b6f03923"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7e2f97c4e8c23c2c25b088bad4df0982','7e2f97c4e8c23c2c25b088bad4df0982');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7e2f97c4e8c23c2c25b088bad4df0982" value="decompress [(3,5)]" /><br /><div class="answer" id="res7e2f97c4e8c23c2c25b088bad4df0982"><code class="result">[5, 5, 5]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','4c1490c24587f73b0411dbc014925fec','4c1490c24587f73b0411dbc014925fec');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4c1490c24587f73b0411dbc014925fec" value="decompress [(5,True),(2,False),(1,True)]" /><br /><div class="answer" id="res4c1490c24587f73b0411dbc014925fec"><code class="result">[True, True, True, True, True, False, False, True]</code><code> :: </code><code class="type">[Bool]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ce2be9d4a808275ea1fba97cdaf29d01','ce2be9d4a808275ea1fba97cdaf29d01');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareace2be9d4a808275ea1fba97cdaf29d01" value="decompress [(1,'a'),(2,'b'),(4,'c'),(1,'b')]" /><br /><div class="answer" id="resce2be9d4a808275ea1fba97cdaf29d01"><code class="result">&quot;abbccccb&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
<section id="exercise-35" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>Prelude.iterate</code> that iterates a function on a given element.</p>
<div class="sourceCode" id="cb61"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb61-1" data-line-number="1">iterate<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</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=FL_FunDef_en_5cdc93bfcb027573613460832021415f.hs','5cdc93bfcb027573613460832021415f','5cdc93bfcb027573613460832021415f');"><textarea cols="80" rows="3" id="tarea5cdc93bfcb027573613460832021415f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res5cdc93bfcb027573613460832021415f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c98f2da3cdf131c05f29581b3062fbcd','c98f2da3cdf131c05f29581b3062fbcd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac98f2da3cdf131c05f29581b3062fbcd" value="take 10 (iterate (*2) 1)" /><br /><div class="answer" id="resc98f2da3cdf131c05f29581b3062fbcd"><code class="result">[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
</section>
<section id="the-operator" class="level1">
<h1>The <code>($)</code> operator</h1>
<p>This operator forces evaluation of values to its right. You can use it instead of parentheses in some cases.</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="kw">infixr</span> <span class="dv">0</span> <span class="fu">$</span></a></code></pre></div>
<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">($) ::</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> b</a></code></pre></div>
<div class="sourceCode" id="cb64"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb64-1" data-line-number="1">f <span class="fu">$</span> x <span class="fu">=</span> f x</a></code></pre></div>
<p>Use case:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','291ea3a75343852a82f6fc34084d0272','291ea3a75343852a82f6fc34084d0272');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea291ea3a75343852a82f6fc34084d0272" value="sin $ cos $ 4 + log 1" /><br /><div class="answer" id="res291ea3a75343852a82f6fc34084d0272"></div></form>
<p>Same as:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','f45c91e0032003b98422fdf54e9baec9','f45c91e0032003b98422fdf54e9baec9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf45c91e0032003b98422fdf54e9baec9" value="sin (cos (4 + log 1))" /><br /><div class="answer" id="resf45c91e0032003b98422fdf54e9baec9"></div></form>
</section>
<section id="lambda-functions" class="level1">
<h1>Lambda Functions</h1>
<p>A lambda function is an unnamed function. The body of the function is given instead of its name.</p>
<p>Instead of this:</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">filterOdds ::</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [<span class="dt">Int</span>]</a>
<a class="sourceLine" id="cb65-2" data-line-number="2">filterOdds xs <span class="fu">=</span> filter isOdd xs <span class="kw">where</span></a>
<a class="sourceLine" id="cb65-3" data-line-number="3">  isOdd x <span class="fu">=</span> x <span class="ot">`mod`</span> <span class="dv">2</span> <span class="fu">/=</span> <span class="dv">0</span></a></code></pre></div>
<p>We can write this:</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">filterOdds&#39; ::</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [<span class="dt">Int</span>]</a>
<a class="sourceLine" id="cb66-2" data-line-number="2">filterOdds&#39; xs <span class="fu">=</span> filter (\x <span class="ot">-&gt;</span> x <span class="ot">`mod`</span> <span class="dv">2</span> <span class="fu">/=</span> <span class="dv">0</span>) xs</a></code></pre></div>
<p>In Mathematics: x ↦ x + 1</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7097c78852ce5480283a565c7d14c683','7097c78852ce5480283a565c7d14c683');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7097c78852ce5480283a565c7d14c683" value="\x -&gt; x + 1           -- same as (+1)" /><br /><div class="answer" id="res7097c78852ce5480283a565c7d14c683"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1e1e5b1a67c74607548f338ce90b0f83','1e1e5b1a67c74607548f338ce90b0f83');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1e1e5b1a67c74607548f338ce90b0f83" value="\x -&gt; 2*x + 1" /><br /><div class="answer" id="res1e1e5b1a67c74607548f338ce90b0f83"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d92e069a00bc49cd876b0a45e9d530a3','d92e069a00bc49cd876b0a45e9d530a3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread92e069a00bc49cd876b0a45e9d530a3" value="\x -&gt; x `mod` 2 == 0   -- same as even" /><br /><div class="answer" id="resd92e069a00bc49cd876b0a45e9d530a3"></div></form>
<section id="exercise-36" class="level2">
<h2>Exercise</h2>
<p>Define the sequence of Fibonacci pairs:</p>
<pre><code>(0,1), (1,1), (1,2), (2,3), (3,5), (5,8), ...</code></pre>
<p>Hint. Use the following production rule: (a, b) ↦ (b, a + b).</p>
<div class="sourceCode" id="cb68"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb68-1" data-line-number="1"><span class="ot">fibPairs ::</span> [(<span class="dt">Integer</span>, <span class="dt">Integer</span>)]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_798868729e19745c575006b0b9e22759.hs','798868729e19745c575006b0b9e22759','798868729e19745c575006b0b9e22759');"><textarea cols="80" rows="3" id="tarea798868729e19745c575006b0b9e22759"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res798868729e19745c575006b0b9e22759"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','4b642ee9e4ecb2851bce4d3c02751df0','4b642ee9e4ecb2851bce4d3c02751df0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4b642ee9e4ecb2851bce4d3c02751df0" value="take 5 fibPairs" /><br /><div class="answer" id="res4b642ee9e4ecb2851bce4d3c02751df0"><code class="result">[(0, 1), (1, 1), (1, 2), (2, 3), (3, 5)]</code><code> :: </code><code class="type">[(Integer, Integer)]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7c420a086752d16daf2d145c04f865e4','7c420a086752d16daf2d145c04f865e4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7c420a086752d16daf2d145c04f865e4" value="take 8 (map fst fibPairs)" /><br /><div class="answer" id="res7c420a086752d16daf2d145c04f865e4"><code class="result">[0, 1, 1, 2, 3, 5, 8, 13]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
</section>
<section id="group-and-groupby" class="level1">
<h1><code>group</code> and <code>groupBy</code></h1>
<p>Note that <code>Data.List.group</code> is actually expressed as the follows.</p>
<div class="sourceCode" id="cb69"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb69-1" data-line-number="1">group<span class="ot"> ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> [[a]]</a>
<a class="sourceLine" id="cb69-2" data-line-number="2">group <span class="fu">=</span> groupBy (<span class="fu">==</span>)</a></code></pre></div>
<p>Inspect the type and semantics of this <code>groupBy</code> function.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','5e2023e989367df931b4151f1a390f97','5e2023e989367df931b4151f1a390f97');"><div class="answer" id="res5e2023e989367df931b4151f1a390f97"><code class="result">groupBy</code><code> :: </code><code class="type">(a -&gt; a -&gt; Bool) -&gt; [a] -&gt; [[a]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d85699468fa4847c8b710bccb2a48a40','d85699468fa4847c8b710bccb2a48a40');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread85699468fa4847c8b710bccb2a48a40" value="group [1,2,2,1,1,1]" /><br /><div class="answer" id="resd85699468fa4847c8b710bccb2a48a40"><code class="result">[[1], [2, 2], [1, 1, 1]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','0c3071ff541e9d4300da3336e47327d7','0c3071ff541e9d4300da3336e47327d7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0c3071ff541e9d4300da3336e47327d7" value="groupBy (\x y -&gt; isAlpha x &amp;&amp; isAlpha y) &quot;ab12cd&quot;" /><br /><div class="answer" id="res0c3071ff541e9d4300da3336e47327d7"><code class="result">[&quot;ab&quot;, &quot;1&quot;, &quot;2&quot;, &quot;cd&quot;]</code><code> :: </code><code class="type">[[Char]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','9c7ec638f5bdfdd5859afa402b6c611a','9c7ec638f5bdfdd5859afa402b6c611a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9c7ec638f5bdfdd5859afa402b6c611a" value="groupBy (\x y -&gt; y &lt; x + 2) [1,2,3,4,5]" /><br /><div class="answer" id="res9c7ec638f5bdfdd5859afa402b6c611a"><code class="result">[[1, 2], [3, 4], [5]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
<div class="handout">
<hr />
<p>Let <code>f</code> be a (two-parameter predicate) function of type <code>a -&gt; a -&gt; Bool</code>. For all <code>x</code>, <code>y</code>, and <code>z</code> where <code>f x y</code>, <code>f y z</code>, and <code>f x z</code> holds, <code>groupBy f</code> sticks all the subsequent elements together where <code>f</code> is true.</p>
</div>
</section>
<section id="the-on-function" class="level1">
<h1>The <code>on</code> function</h1>
<p>Observe the type of the <code>Data.Function.on</code> function and redefine it.</p>
<div class="sourceCode" id="cb70"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb70-1" data-line-number="1"><span class="ot">on ::</span> (b <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> c) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> c)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_36472053e12aab86fdfaedb663528d3e.hs','36472053e12aab86fdfaedb663528d3e','36472053e12aab86fdfaedb663528d3e');"><textarea cols="80" rows="3" id="tarea36472053e12aab86fdfaedb663528d3e"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res36472053e12aab86fdfaedb663528d3e"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','0c0e6c9262cbb7748b6ce1db8116faac','0c0e6c9262cbb7748b6ce1db8116faac');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0c0e6c9262cbb7748b6ce1db8116faac" value="((==) `on` isDigit) '1' '2'" /><br /><div class="answer" id="res0c0e6c9262cbb7748b6ce1db8116faac"><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_FunDef_en.hs','23c340adb2c9de7ab445cf215a8a34b9','23c340adb2c9de7ab445cf215a8a34b9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea23c340adb2c9de7ab445cf215a8a34b9" value="((==) `on` isDigit) '1' 'c'" /><br /><div class="answer" id="res23c340adb2c9de7ab445cf215a8a34b9"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','a2b81f372c2ab1f44f48f2ff4f60dc8e','a2b81f372c2ab1f44f48f2ff4f60dc8e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa2b81f372c2ab1f44f48f2ff4f60dc8e" value="((==) `on` isDigit) 'x' 'c'" /><br /><div class="answer" id="resa2b81f372c2ab1f44f48f2ff4f60dc8e"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<section id="exercise-37" class="level2">
<h2>Exercise</h2>
<p>Define a function for extracting numbers from a string.</p>
<div class="sourceCode" id="cb71"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb71-1" data-line-number="1"><span class="ot">numbersInString ::</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=FL_FunDef_en_382bc8b1dd2f74c25243635e4ad8d4a2.hs','382bc8b1dd2f74c25243635e4ad8d4a2','382bc8b1dd2f74c25243635e4ad8d4a2');"><textarea cols="80" rows="3" id="tarea382bc8b1dd2f74c25243635e4ad8d4a2"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res382bc8b1dd2f74c25243635e4ad8d4a2"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','051457e9c38d573031bd1ce2260df1f6','051457e9c38d573031bd1ce2260df1f6');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea051457e9c38d573031bd1ce2260df1f6" value="numbersInString &quot;34 24x +48&quot;" /><br /><div class="answer" id="res051457e9c38d573031bd1ce2260df1f6"><code class="result">[&quot;34&quot;, &quot;24&quot;, &quot;48&quot;]</code><code> :: </code><code class="type">[String]</code></div></form>
</section>
</section>
<section id="compare-and-ordering" class="level1">
<h1><code>compare</code> and <code>Ordering</code></h1>
<p>The <code>compare</code> function is defined for every type that is a member of the <code>Ord</code> type class.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','6feaf7469b91bc1e9d84d5e0ba9e83f0','6feaf7469b91bc1e9d84d5e0ba9e83f0');"><div class="answer" id="res6feaf7469b91bc1e9d84d5e0ba9e83f0"><code class="result">compare</code><code> :: </code><code class="type">Ord a =&gt; a -&gt; a -&gt; Ordering</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','61417bf852531708ce05b289d71b09b1','61417bf852531708ce05b289d71b09b1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea61417bf852531708ce05b289d71b09b1" value="1 `compare` 2" /><br /><div class="answer" id="res61417bf852531708ce05b289d71b09b1"><code class="result">LT</code><code> :: </code><code class="type">Ordering</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','939e7a46f3c8fa7b991e974c44562f82','939e7a46f3c8fa7b991e974c44562f82');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea939e7a46f3c8fa7b991e974c44562f82" value="2 `compare` 2" /><br /><div class="answer" id="res939e7a46f3c8fa7b991e974c44562f82"><code class="result">EQ</code><code> :: </code><code class="type">Ordering</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','5eac15c0d6a004fa2b07ba7558963e4e','5eac15c0d6a004fa2b07ba7558963e4e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5eac15c0d6a004fa2b07ba7558963e4e" value="3 `compare` 2" /><br /><div class="answer" id="res5eac15c0d6a004fa2b07ba7558963e4e"><code class="result">GT</code><code> :: </code><code class="type">Ordering</code></div></form>
<p><code>Ordering</code> is a ternary data type, and it has the following constructors: <code>LT</code> for “less than”, <code>EQ</code> for “equals”, and <code>GT</code> for “greater than”.</p>
</section>
<section id="maximumby-minimumby-and-sortby" class="level1">
<h1><code>maximumBy</code>, <code>minimumBy</code>, and <code>sortBy</code></h1>
<p>There are many other “by” functions that could be used in conjunction with <code>compare</code>. Such functions are the higher-order versions of their standard counterparts with the difference that the way of comparison could be set by function argument.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','06dfa35be62940021ccfaf20cbccfaf5','06dfa35be62940021ccfaf20cbccfaf5');"><div class="answer" id="res06dfa35be62940021ccfaf20cbccfaf5"><code class="result">maximumBy</code><code> :: </code><code class="type">Foldable t =&gt; (a -&gt; a -&gt; Ordering) -&gt; t a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d33cddd9781ce9de24b13da217e4f8d2','d33cddd9781ce9de24b13da217e4f8d2');"><div class="answer" id="resd33cddd9781ce9de24b13da217e4f8d2"><code class="result">minimumBy</code><code> :: </code><code class="type">Foldable t =&gt; (a -&gt; a -&gt; Ordering) -&gt; t a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1b4bf559a50c6bc942970b21febfac2b','1b4bf559a50c6bc942970b21febfac2b');"><div class="answer" id="res1b4bf559a50c6bc942970b21febfac2b"><code class="result">sortBy</code><code> :: </code><code class="type">(a -&gt; a -&gt; Ordering) -&gt; [a] -&gt; [a]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','8f4d1c995691af548b6c5b5ff3b850b2','8f4d1c995691af548b6c5b5ff3b850b2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8f4d1c995691af548b6c5b5ff3b850b2" value="maximumBy  compare              [&quot;bar&quot;,&quot;baz&quot;,&quot;foo&quot;,&quot;foobar&quot;]" /><br /><div class="answer" id="res8f4d1c995691af548b6c5b5ff3b850b2"><code class="result">&quot;foobar&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','895f1ace96b53d0376012612887f2f3a','895f1ace96b53d0376012612887f2f3a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea895f1ace96b53d0376012612887f2f3a" value="maximumBy (compare `on` length) [&quot;bar&quot;,&quot;baz&quot;,&quot;foo&quot;,&quot;foobar&quot;]" /><br /><div class="answer" id="res895f1ace96b53d0376012612887f2f3a"><code class="result">&quot;foobar&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','09613feb4a481071f0ffbecf0dcdec75','09613feb4a481071f0ffbecf0dcdec75');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea09613feb4a481071f0ffbecf0dcdec75" value="maximumBy (compare `on` last)   [&quot;bar&quot;,&quot;baz&quot;,&quot;foo&quot;,&quot;foobar&quot;]" /><br /><div class="answer" id="res09613feb4a481071f0ffbecf0dcdec75"><code class="result">&quot;baz&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','922433a0f9d53dab3c856c525625c52c','922433a0f9d53dab3c856c525625c52c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea922433a0f9d53dab3c856c525625c52c" value="sortBy    (compare `on` last)   [&quot;bar&quot;,&quot;baz&quot;,&quot;foo&quot;,&quot;foobar&quot;]" /><br /><div class="answer" id="res922433a0f9d53dab3c856c525625c52c"><code class="result">[&quot;foo&quot;, &quot;bar&quot;, &quot;foobar&quot;, &quot;baz&quot;]</code><code> :: </code><code class="type">[[Char]]</code></div></form>
</section>
<section id="prelude.flip" class="level1">
<h1><code>Prelude.flip</code></h1>
<p>Redefine the <code>flip</code> function. This is to flip the order of the arguments for a two-parameter function.</p>
<div class="sourceCode" id="cb72"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb72-1" data-line-number="1">flip<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> b <span class="ot">-&gt;</span> c) <span class="ot">-&gt;</span> (b <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> c)</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_bc7ab9d9d9207043c39555835225c8af.hs','bc7ab9d9d9207043c39555835225c8af','bc7ab9d9d9207043c39555835225c8af');"><textarea cols="80" rows="3" id="tareabc7ab9d9d9207043c39555835225c8af"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resbc7ab9d9d9207043c39555835225c8af"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','da1c54d8cdc26cb750412b9a1f7251ff','da1c54d8cdc26cb750412b9a1f7251ff');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareada1c54d8cdc26cb750412b9a1f7251ff" value="flip (-) 4 1" /><br /><div class="answer" id="resda1c54d8cdc26cb750412b9a1f7251ff"><code class="result">-3</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1767a75706619c14b4e15cc7bd427deb','1767a75706619c14b4e15cc7bd427deb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1767a75706619c14b4e15cc7bd427deb" value="sortBy (flip compare) [1,5,3,7]" /><br /><div class="answer" id="res1767a75706619c14b4e15cc7bd427deb"><code class="result">[7, 5, 3, 1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<section id="exercise-38" class="level2">
<h2>Exercise</h2>
<p>Find the longest word in a string.</p>
<div class="sourceCode" id="cb73"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb73-1" data-line-number="1"><span class="ot">longestWord ::</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=FL_FunDef_en_cd606015fd8da855520c8be52864b559.hs','cd606015fd8da855520c8be52864b559','cd606015fd8da855520c8be52864b559');"><textarea cols="80" rows="3" id="tareacd606015fd8da855520c8be52864b559"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rescd606015fd8da855520c8be52864b559"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','9b9aed27383be659245a45f084479af5','9b9aed27383be659245a45f084479af5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9b9aed27383be659245a45f084479af5" value="longestWord &quot;Find the longest word in this string.&quot;" /><br /><div class="answer" id="res9b9aed27383be659245a45f084479af5"><code class="result">&quot;string.&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-39" class="level2">
<h2>Exercise</h2>
<p>Determine which character occurs the most in a string.</p>
<div class="sourceCode" id="cb74"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb74-1" data-line-number="1"><span class="ot">mostFrequentChar ::</span> <span class="dt">String</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=FL_FunDef_en_a01a9bcdcc52727d861e1032cfc332c7.hs','a01a9bcdcc52727d861e1032cfc332c7','a01a9bcdcc52727d861e1032cfc332c7');"><textarea cols="80" rows="3" id="tareaa01a9bcdcc52727d861e1032cfc332c7"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resa01a9bcdcc52727d861e1032cfc332c7"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','39e5f8cc618c7d5cebb011a36baf2064','39e5f8cc618c7d5cebb011a36baf2064');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea39e5f8cc618c7d5cebb011a36baf2064" value="mostFrequentChar &quot;foobar&quot;" /><br /><div class="answer" id="res39e5f8cc618c7d5cebb011a36baf2064"><code class="result">'o'</code><code> :: </code><code class="type">Char</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1db3309a5c95782fa5569645c0de9905','1db3309a5c95782fa5569645c0de9905');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1db3309a5c95782fa5569645c0de9905" value="mostFrequentChar &quot;pneumonoultramicroscopicsilicovolcanoconiosis&quot;" /><br /><div class="answer" id="res1db3309a5c95782fa5569645c0de9905"><code class="result">'o'</code><code> :: </code><code class="type">Char</code></div></form>
</section>
<section id="exercise-40" class="level2">
<h2>Exercise</h2>
<p>Determine at which index is the greatest element in the list. (The indexing shall start from 1.)</p>
<div class="sourceCode" id="cb75"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb75-1" data-line-number="1"><span class="ot">maxIndex ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</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_FunDef_en_c994990aa9064364ba6608b550c38e52.hs','c994990aa9064364ba6608b550c38e52','c994990aa9064364ba6608b550c38e52');"><textarea cols="80" rows="3" id="tareac994990aa9064364ba6608b550c38e52"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resc994990aa9064364ba6608b550c38e52"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','6c98c42dff8376737ba93a1329d18531','6c98c42dff8376737ba93a1329d18531');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6c98c42dff8376737ba93a1329d18531" value="maxIndex [4, sqrt 14, 50/13, 3**1.3]" /><br /><div class="answer" id="res6c98c42dff8376737ba93a1329d18531"><code class="result">4</code><code> :: </code><code class="type">Int</code></div></form>
</section>
</section>
<section id="function-composition" class="level1">
<h1>Function Composition</h1>
<p>Definition:</p>
<div class="sourceCode" id="cb76"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb76-1" data-line-number="1"><span class="ot">(.) ::</span> (b <span class="ot">-&gt;</span> c) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> c)</a>
<a class="sourceLine" id="cb76-2" data-line-number="2">f <span class="fu">.</span> g <span class="fu">=</span> h  <span class="kw">where</span></a>
<a class="sourceLine" id="cb76-3" data-line-number="3"></a>
<a class="sourceLine" id="cb76-4" data-line-number="4">    h x <span class="fu">=</span> f (g x)</a></code></pre></div>
<p>Alternative definition:</p>
<div class="sourceCode" id="cb77"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb77-1" data-line-number="1">(f <span class="fu">.</span> g) x <span class="fu">=</span> f (g x)</a></code></pre></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d0cbe71f007ae9390813f00726a517d0','d0cbe71f007ae9390813f00726a517d0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread0cbe71f007ae9390813f00726a517d0" value="map ((+1) . (*2)) [1..4]" /><br /><div class="answer" id="resd0cbe71f007ae9390813f00726a517d0"><code class="result">[3, 5, 7, 9]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<section id="exercise-41" class="level2">
<h2>Exercise</h2>
<p>Construct the sequence 1, 11, 111, 1111, …</p>
<div class="sourceCode" id="cb78"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb78-1" data-line-number="1"><span class="ot">numbersMadeOfOnes ::</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_2e9225ab1821ab49175f5afe1caf3a16.hs','2e9225ab1821ab49175f5afe1caf3a16','2e9225ab1821ab49175f5afe1caf3a16');"><textarea cols="80" rows="3" id="tarea2e9225ab1821ab49175f5afe1caf3a16"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res2e9225ab1821ab49175f5afe1caf3a16"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b07463c65438c5a975d97611009ef23b','b07463c65438c5a975d97611009ef23b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab07463c65438c5a975d97611009ef23b" value="take 4 numbersMadeOfOnes" /><br /><div class="answer" id="resb07463c65438c5a975d97611009ef23b"><code class="result">[1, 11, 111, 1111]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','00c7c7c3cb3a5a1e06697d5221ce85bc','00c7c7c3cb3a5a1e06697d5221ce85bc');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea00c7c7c3cb3a5a1e06697d5221ce85bc" value="numbersMadeOfOnes !! 19" /><br /><div class="answer" id="res00c7c7c3cb3a5a1e06697d5221ce85bc"><code class="result">11111111111111111111</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-42" class="level2">
<h2>Exercise</h2>
<p>Define double map with function composition.</p>
<div class="sourceCode" id="cb79"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb79-1" data-line-number="1"><span class="ot">mapMap ::</span> (a <span class="ot">-&gt;</span> b) <span class="ot">-&gt;</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_FunDef_en_162b01d5cd8b7ac01f0c172e857289e6.hs','162b01d5cd8b7ac01f0c172e857289e6','162b01d5cd8b7ac01f0c172e857289e6');"><textarea cols="80" rows="3" id="tarea162b01d5cd8b7ac01f0c172e857289e6"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res162b01d5cd8b7ac01f0c172e857289e6"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','af2bbfe07ad74af08d4d4c5e9f771ffd','af2bbfe07ad74af08d4d4c5e9f771ffd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf2bbfe07ad74af08d4d4c5e9f771ffd" value="mapMap (+1) [[1,2], [3,4]]" /><br /><div class="answer" id="resaf2bbfe07ad74af08d4d4c5e9f771ffd"><code class="result">[[2, 3], [4, 5]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-43" class="level2">
<h2>Exercise</h2>
<p>Define <code>monogram</code>.</p>
<div class="sourceCode" id="cb80"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb80-1" data-line-number="1"><span class="ot">monogram ::</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=FL_FunDef_en_051f12240c364fc803a9ee9e267d0d75.hs','051f12240c364fc803a9ee9e267d0d75','051f12240c364fc803a9ee9e267d0d75');"><textarea cols="80" rows="3" id="tarea051f12240c364fc803a9ee9e267d0d75"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res051f12240c364fc803a9ee9e267d0d75"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','a6453a32c4465acb813f0eee1efad18c','a6453a32c4465acb813f0eee1efad18c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa6453a32c4465acb813f0eee1efad18c" value="monogram &quot;Jim Carrey&quot;" /><br /><div class="answer" id="resa6453a32c4465acb813f0eee1efad18c"><code class="result">&quot;J. C.&quot;</code><code> :: </code><code class="type">String</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d72921cbc6b04b2db5961c42c7e2a628','d72921cbc6b04b2db5961c42c7e2a628');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread72921cbc6b04b2db5961c42c7e2a628" value="monogram &quot;Ilosvai Selymes P&#233;ter&quot;" /><br /><div class="answer" id="resd72921cbc6b04b2db5961c42c7e2a628"><code class="result">&quot;I. S. P.&quot;</code><code> :: </code><code class="type">String</code></div></form>
</section>
<section id="exercise-44" class="level2">
<h2>Exercise</h2>
<p>Implement the function named <code>uniq</code> (as a composition) that eliminates all the redudant elements from a list.</p>
<div class="sourceCode" id="cb81"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb81-1" data-line-number="1"><span class="ot">uniq ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> [a]<span class="co">{-finite-}</span> <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_ef6db82c32a58fe33ea91724ee788d32.hs','ef6db82c32a58fe33ea91724ee788d32','ef6db82c32a58fe33ea91724ee788d32');"><textarea cols="80" rows="3" id="tareaef6db82c32a58fe33ea91724ee788d32"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resef6db82c32a58fe33ea91724ee788d32"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c98202e1986092ae27861d3693232457','c98202e1986092ae27861d3693232457');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac98202e1986092ae27861d3693232457" value="uniq &quot;Mississippi&quot;" /><br /><div class="answer" id="resc98202e1986092ae27861d3693232457"><code class="result">&quot;Mips&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p><em>Hint.</em> Here is how it shall work:</p>
<p><img src="FL_FunDef_en45ebd4a99f9a733869e8278391675ec4.png" alt="FL_FunDef_en45ebd4a99f9a733869e8278391675ec4.png" /></p>
</section>
<section id="exercise-45" class="level2">
<h2>Exercise</h2>
<p>Let <code>repeated</code> be a (composed) function that determines what elements occur more than once in a list.</p>
<div class="sourceCode" id="cb82"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb82-1" data-line-number="1"><span class="ot">repeated ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> [a]<span class="co">{-finite-}</span> <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=FL_FunDef_en_45f558579e31ebc91b2c56957a72d0b1.hs','45f558579e31ebc91b2c56957a72d0b1','45f558579e31ebc91b2c56957a72d0b1');"><textarea cols="80" rows="3" id="tarea45f558579e31ebc91b2c56957a72d0b1"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res45f558579e31ebc91b2c56957a72d0b1"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','31b6dd8a2283c04104e2684300368b69','31b6dd8a2283c04104e2684300368b69');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea31b6dd8a2283c04104e2684300368b69" value="repeated [1,2,3,4,2,5,6,7,1]" /><br /><div class="answer" id="res31b6dd8a2283c04104e2684300368b69"><code class="result">[1, 2]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<p><em>Hint.</em> Here is how it shall work:</p>
<p><img src="FL_FunDef_en9eca8299bd9dc3ca3ada5bee09704d3e.png" alt="FL_FunDef_en9eca8299bd9dc3ca3ada5bee09704d3e.png" /></p>
</section>
<section id="exercise-46" class="level2">
<h2>Exercise</h2>
<p>Redefine the <code>Prelude.until</code> function (as a composition).</p>
<div class="sourceCode" id="cb83"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb83-1" data-line-number="1">until<span class="ot"> ::</span> (a <span class="ot">-&gt;</span> <span class="dt">Bool</span>) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</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=FL_FunDef_en_6d9535139e94c5236f9f3375b0b8278a.hs','6d9535139e94c5236f9f3375b0b8278a','6d9535139e94c5236f9f3375b0b8278a');"><textarea cols="80" rows="3" id="tarea6d9535139e94c5236f9f3375b0b8278a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res6d9535139e94c5236f9f3375b0b8278a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','cf99bb7c738cc629e57f836407b2d6e7','cf99bb7c738cc629e57f836407b2d6e7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacf99bb7c738cc629e57f836407b2d6e7" value="until (==10)  (+1) 1" /><br /><div class="answer" id="rescf99bb7c738cc629e57f836407b2d6e7"><code class="result">10</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','9fb666985f861d79480281c8006efd47','9fb666985f861d79480281c8006efd47');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9fb666985f861d79480281c8006efd47" value="until (&gt;1000) (*2) 1" /><br /><div class="answer" id="res9fb666985f861d79480281c8006efd47"><code class="result">1024</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
</section>
<section id="folds-without-starting-value" class="level1">
<h1>Folds without Starting Value</h1>
<p>Left and right folds:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','7aacc83ffdba4af29d23aebbf107e3d7','7aacc83ffdba4af29d23aebbf107e3d7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7aacc83ffdba4af29d23aebbf107e3d7" value="foldl1 (-) [1,2,3,4]  -- ((1-2)-3)-4" /><br /><div class="answer" id="res7aacc83ffdba4af29d23aebbf107e3d7"><code class="result">-8</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','aa79651809af1cc74b696255d6258395','aa79651809af1cc74b696255d6258395');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaa79651809af1cc74b696255d6258395" value="foldr1 (-) [1,2,3,4]  -- 1-(2-(3-4))" /><br /><div class="answer" id="resaa79651809af1cc74b696255d6258395"><code class="result">-2</code><code> :: </code><code class="type">Integer</code></div></form>
<p>Types:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','59768b013d95b593c4396639db1fcca4','59768b013d95b593c4396639db1fcca4');"><div class="answer" id="res59768b013d95b593c4396639db1fcca4"><code class="result">foldl1</code><code> :: </code><code class="type">Foldable t =&gt; (a -&gt; a -&gt; a) -&gt; t a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ab84db708a8e1a1595082c20992f08f6','ab84db708a8e1a1595082c20992f08f6');"><div class="answer" id="resab84db708a8e1a1595082c20992f08f6"><code class="result">foldr1</code><code> :: </code><code class="type">Foldable t =&gt; (a -&gt; a -&gt; a) -&gt; t a -&gt; a</code></div></form>
<section id="exercise-47" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>Prelude.minimum</code> in terms of some fold and <code>min</code>.</p>
<div class="sourceCode" id="cb84"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb84-1" data-line-number="1">minimum<span class="ot"> ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</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=FL_FunDef_en_93a72dcc50071e9c70392e6054b621fc.hs','93a72dcc50071e9c70392e6054b621fc','93a72dcc50071e9c70392e6054b621fc');"><textarea cols="80" rows="3" id="tarea93a72dcc50071e9c70392e6054b621fc"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res93a72dcc50071e9c70392e6054b621fc"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','a560a4c4f1f90b3f6f8bd49a930cca98','a560a4c4f1f90b3f6f8bd49a930cca98');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa560a4c4f1f90b3f6f8bd49a930cca98" value="minimum [3,4,1,2]  " /><br /><div class="answer" id="resa560a4c4f1f90b3f6f8bd49a930cca98"><code class="result">1</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
</section>
<section id="folds-with-starting-value" class="level1">
<h1>Folds with Starting Value</h1>
<p>Left and right folds:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','2a56c500048c76a3d1ba3f764297566d','2a56c500048c76a3d1ba3f764297566d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a56c500048c76a3d1ba3f764297566d" value="foldl (-) 1 [2,3,4]   -- ((1-2)-3)-4" /><br /><div class="answer" id="res2a56c500048c76a3d1ba3f764297566d"><code class="result">-8</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','94ece5649715a7a8c44e6dbb47b83e0a','94ece5649715a7a8c44e6dbb47b83e0a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea94ece5649715a7a8c44e6dbb47b83e0a" value="foldr (-) 1 [2,3,4]   -- 2-(3-(4-1))" /><br /><div class="answer" id="res94ece5649715a7a8c44e6dbb47b83e0a"><code class="result">2</code><code> :: </code><code class="type">Integer</code></div></form>
<p>Types:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','cfb64c5dcbcb0840c7c5d90c0fd9ea37','cfb64c5dcbcb0840c7c5d90c0fd9ea37');"><div class="answer" id="rescfb64c5dcbcb0840c7c5d90c0fd9ea37"><code class="result">foldl</code><code> :: </code><code class="type">Foldable t =&gt; (b -&gt; a -&gt; b) -&gt; b -&gt; t a -&gt; b</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','880de5f821034335949062f918009d90','880de5f821034335949062f918009d90');"><div class="answer" id="res880de5f821034335949062f918009d90"><code class="result">foldr</code><code> :: </code><code class="type">Foldable t =&gt; (a -&gt; b -&gt; b) -&gt; b -&gt; t a -&gt; b</code></div></form>
<section id="exercise-48" class="level2">
<h2>Exercise</h2>
<p>Redefine <code>Prelude.product</code> in terms of a fold.</p>
<div class="sourceCode" id="cb85"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb85-1" data-line-number="1">product<span class="ot"> ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</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=FL_FunDef_en_c77bfab9ee2bf937d35c39b9c4284129.hs','c77bfab9ee2bf937d35c39b9c4284129','c77bfab9ee2bf937d35c39b9c4284129');"><textarea cols="80" rows="3" id="tareac77bfab9ee2bf937d35c39b9c4284129"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resc77bfab9ee2bf937d35c39b9c4284129"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','50466246279b7acff927231f8b680ced','50466246279b7acff927231f8b680ced');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea50466246279b7acff927231f8b680ced" value="product [1..4] " /><br /><div class="answer" id="res50466246279b7acff927231f8b680ced"><code class="result">24</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','423562d2321ab890c28ef38809baf309','423562d2321ab890c28ef38809baf309');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea423562d2321ab890c28ef38809baf309" value="product []" /><br /><div class="answer" id="res423562d2321ab890c28ef38809baf309"><code class="result">1</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-49" class="level2">
<h2>Exercise</h2>
<p>Redefined <code>Prelude.and</code> in terms of a fold.</p>
<div class="sourceCode" id="cb86"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb86-1" data-line-number="1">and<span class="ot"> ::</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=FL_FunDef_en_b51cfb1a721e2fdd66d071bcffe0df1a.hs','b51cfb1a721e2fdd66d071bcffe0df1a','b51cfb1a721e2fdd66d071bcffe0df1a');"><textarea cols="80" rows="4" id="tareab51cfb1a721e2fdd66d071bcffe0df1a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb51cfb1a721e2fdd66d071bcffe0df1a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','27a809b9a0ecf73aae4f560058536449','27a809b9a0ecf73aae4f560058536449');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea27a809b9a0ecf73aae4f560058536449" value="and [True, True, True]" /><br /><div class="answer" id="res27a809b9a0ecf73aae4f560058536449"><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_FunDef_en.hs','7b1070cef164c303145726fb1cd8ef1d','7b1070cef164c303145726fb1cd8ef1d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7b1070cef164c303145726fb1cd8ef1d" value="and [True, True, False]" /><br /><div class="answer" id="res7b1070cef164c303145726fb1cd8ef1d"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','c7c45533dc28f0edfce8d71a09cae97d','c7c45533dc28f0edfce8d71a09cae97d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac7c45533dc28f0edfce8d71a09cae97d" value="and []" /><br /><div class="answer" id="resc7c45533dc28f0edfce8d71a09cae97d"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
</section>
<section id="additional-fold-examples" class="level1">
<h1>Additional Fold Examples</h1>
<div class="sourceCode" id="cb87"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb87-1" data-line-number="1">concat<span class="ot"> ::</span> [[a]] <span class="ot">-&gt;</span> [a]</a>
<a class="sourceLine" id="cb87-2" data-line-number="2">concat <span class="fu">=</span> foldr (<span class="fu">++</span>) []</a></code></pre></div>
<p>This is the same as this:</p>
<div class="sourceCode" id="cb88"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb88-1" data-line-number="1"><span class="ot">concat&#39; ::</span> [[a]] <span class="ot">-&gt;</span> [a]</a>
<a class="sourceLine" id="cb88-2" data-line-number="2">concat&#39; xs <span class="fu">=</span> foldr (<span class="fu">++</span>) [] xs</a></code></pre></div>
<p>Here is how we use it:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','be9c19febee9da3103563fb3e13c01fb','be9c19febee9da3103563fb3e13c01fb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareabe9c19febee9da3103563fb3e13c01fb" value="concat [&quot;noodle&quot;,&quot;spatula&quot;,&quot;zmrzlina&quot;]" /><br /><div class="answer" id="resbe9c19febee9da3103563fb3e13c01fb"><code class="result">&quot;noodlespatulazmrzlina&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p>Try these functions yourself. Make sure you understand how they work.</p>
<div class="sourceCode" id="cb89"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb89-1" data-line-number="1">isort   <span class="fu">=</span> foldr insert []</a>
<a class="sourceLine" id="cb89-2" data-line-number="2"></a>
<a class="sourceLine" id="cb89-3" data-line-number="3">a <span class="fu">++</span> b  <span class="fu">=</span> foldr (<span class="fu">:</span>) b a</a>
<a class="sourceLine" id="cb89-4" data-line-number="4"></a>
<a class="sourceLine" id="cb89-5" data-line-number="5">length  <span class="fu">=</span> foldl (\a b <span class="ot">-&gt;</span> a <span class="fu">+</span> <span class="dv">1</span>) <span class="dv">0</span></a>
<a class="sourceLine" id="cb89-6" data-line-number="6"></a>
<a class="sourceLine" id="cb89-7" data-line-number="7">reverse <span class="fu">=</span> foldl (flip (<span class="fu">:</span>)) []</a></code></pre></div>
</section>
<section id="scans" class="level1">
<h1>Scans</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','1bc8ec3343e0e1af2b0a2d4b4f65b0f5','1bc8ec3343e0e1af2b0a2d4b4f65b0f5');"><div class="answer" id="res1bc8ec3343e0e1af2b0a2d4b4f65b0f5"><code class="result">scanl</code><code> :: </code><code class="type">(b -&gt; a -&gt; b) -&gt; b -&gt; [a] -&gt; [b]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','b73949ec59ffdf87c03e71e2691a741a','b73949ec59ffdf87c03e71e2691a741a');"><div class="answer" id="resb73949ec59ffdf87c03e71e2691a741a"><code class="result">scanr</code><code> :: </code><code class="type">(a -&gt; b -&gt; b) -&gt; b -&gt; [a] -&gt; [b]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','d27a6e1fd6a5c920708510bcb4245d4c','d27a6e1fd6a5c920708510bcb4245d4c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread27a6e1fd6a5c920708510bcb4245d4c" value="scanl (+) 0 [1..10]" /><br /><div class="answer" id="resd27a6e1fd6a5c920708510bcb4245d4c"><code class="result">[0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_FunDef_en.hs','ec20dc039c07f6ed2e9058cbeed3de24','ec20dc039c07f6ed2e9058cbeed3de24');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaec20dc039c07f6ed2e9058cbeed3de24" value="scanr (+) 0 [1..10]" /><br /><div class="answer" id="resec20dc039c07f6ed2e9058cbeed3de24"><code class="result">[55, 54, 52, 49, 45, 40, 34, 27, 19, 10, 0]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<p>A scan is similar to a fold, but it returns a value for each application in the input list. In this way, a scan can help us understand how fold-based algorithms work. For example, consider, the <code>isort</code> function above. If we replace <code>foldr</code> with <code>scanr</code>, we can see step of insertion sort, in reverse order:</p>
<div class="sourceCode" id="cb90"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb90-1" data-line-number="1"></a>
<a class="sourceLine" id="cb90-2" data-line-number="2">isort_scan <span class="fu">=</span> scanr insert []</a>
<a class="sourceLine" id="cb90-3" data-line-number="3"></a>
<a class="sourceLine" id="cb90-4" data-line-number="4">isort_scan [<span class="dv">10</span>,<span class="dv">30</span>,<span class="fu">-</span><span class="dv">4</span>,<span class="dv">15</span>] <span class="fu">==</span></a>
<a class="sourceLine" id="cb90-5" data-line-number="5">[[<span class="fu">-</span><span class="dv">4</span>,<span class="dv">10</span>,<span class="dv">15</span>,<span class="dv">30</span>],[<span class="fu">-</span><span class="dv">4</span>,<span class="dv">15</span>,<span class="dv">30</span>],[<span class="fu">-</span><span class="dv">4</span>,<span class="dv">15</span>],[<span class="dv">15</span>],[]]</a></code></pre></div>
</section>
</body>
</html>

