<?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>Expressions and Types</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">Expressions and Types</h1>
<div id="info"></div>
<ul>
<li><a href="#number-types">Number Types</a></li>
<li><a href="#ad-hoc-polymorphism">Ad-hoc Polymorphism</a></li>
<li><a href="#basic-arithmetic-operations">Basic Arithmetic Operations</a></li>
<li><a href="#exercises">Exercises</a></li>
<li><a href="#raising-to-a-power">Raising to a Power</a></li>
<li><a href="#polymorphic-literals-and-constants">Polymorphic Literals and Constants</a></li>
<li><a href="#prelude-type-class-hierarchy">Prelude Type Class Hierarchy</a></li>
<li><a href="#the-two-boolean-values">The Two Boolean Values</a></li>
<li><a href="#equality-and-ordering">Equality and Ordering</a><ul>
<li><a href="#exercises-1">Exercises</a></li>
</ul></li>
<li><a href="#boolean-operators">Boolean Operators</a></li>
<li><a href="#functions-and-operators">Functions and Operators</a></li>
<li><a href="#precedences">Precedences</a><ul>
<li><a href="#exercises-2">Exercises</a></li>
</ul></li>
<li><a href="#lists">Lists</a></li>
<li><a href="#dotdot-expressions">Dotdot Expressions</a><ul>
<li><a href="#exercise">Exercise</a></li>
<li><a href="#exercises-3">Exercises</a></li>
</ul></li>
<li><a href="#some-basic-operations-on-lists">Some Basic Operations on Lists</a><ul>
<li><a href="#exercise-1">Exercise</a></li>
</ul></li>
<li><a href="#sum-and-product">Sum and Product</a><ul>
<li><a href="#exercise-2">Exercise</a></li>
<li><a href="#exercise-3">Exercise</a></li>
<li><a href="#exercise-4">Exercise</a></li>
</ul></li>
<li><a href="#list-comprehensions">List Comprehensions</a><ul>
<li><a href="#exercise-5">Exercise</a></li>
<li><a href="#exercise-6">Exercise</a></li>
<li><a href="#exercise-7">Exercise</a></li>
<li><a href="#exercise-8">Exercise</a></li>
<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>
</ul></li>
<li><a href="#pairs">Pairs</a><ul>
<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="#zipping">Zipping</a><ul>
<li><a href="#exercise-17">Exercise</a></li>
</ul></li>
<li><a href="#further-exercises-with-list-comprehensions">Further Exercises with List Comprehensions</a><ul>
<li><a href="#exercise-18">Exercise</a></li>
<li><a href="#exercise-19">Exercise</a></li>
<li><a href="#exercise-20">Exercise</a></li>
<li><a href="#exercise-21">Exercise</a></li>
</ul></li>
</ul>
</div>
<section id="number-types" class="level1">
<h1>Number Types</h1>
<p>Some number types:</p>
<table>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code>Integer</code></td>
<td style="text-align: left;">integer</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Int</code></td>
<td style="text-align: left;">bounded integer (-2147483648..2147483647)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>Rational</code></td>
<td style="text-align: left;">rational</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Float</code></td>
<td style="text-align: left;">single-precision floating-point number</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>Double</code></td>
<td style="text-align: left;">double-precision floating-point number</td>
</tr>
</tbody>
</table>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','45c86bb11099ac4ee22b7ba5774c1177','45c86bb11099ac4ee22b7ba5774c1177');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea45c86bb11099ac4ee22b7ba5774c1177" value="3^19 :: Int" /><br /><div class="answer" id="res45c86bb11099ac4ee22b7ba5774c1177"><code class="result">1162261467</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','2426c3e52f9de2cc21058397e0af9087','2426c3e52f9de2cc21058397e0af9087');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2426c3e52f9de2cc21058397e0af9087" value="3^20 :: Int" /><br /><div class="answer" id="res2426c3e52f9de2cc21058397e0af9087"><code class="result">3486784401</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','558066df52a90351c854917e8c7259e1','558066df52a90351c854917e8c7259e1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea558066df52a90351c854917e8c7259e1" value="3^20 :: Integer " /><br /><div class="answer" id="res558066df52a90351c854917e8c7259e1"><code class="result">3486784401</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','1a962f52f18c26c3e19dc879d598196e','1a962f52f18c26c3e19dc879d598196e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1a962f52f18c26c3e19dc879d598196e" value="5^50 :: Integer" /><br /><div class="answer" id="res1a962f52f18c26c3e19dc879d598196e"><code class="result">88817841970012523233890533447265625</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','af661b7fba47b8ff1fb7dae0d03c7719','af661b7fba47b8ff1fb7dae0d03c7719');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf661b7fba47b8ff1fb7dae0d03c7719" value="1/3 :: Rational" /><br /><div class="answer" id="resaf661b7fba47b8ff1fb7dae0d03c7719"><code class="result">1 :% 3</code><code> :: </code><code class="type">Rational</code></div></form>
</section>
<section id="ad-hoc-polymorphism" class="level1">
<h1>Ad-hoc Polymorphism</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','be9e9a6526ca15e7aa317ef2414bb645','be9e9a6526ca15e7aa317ef2414bb645');"><div class="answer" id="resbe9e9a6526ca15e7aa317ef2414bb645"><code class="result">(+)</code><code> :: </code><code class="type">Num a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Num a</code> means that <code>a</code> is replaceable with <code>Int</code>, <code>Integer</code>, <code>Rational</code>, <code>Float</code>, <code>Double</code>, …</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="ot">(+) ::</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>
<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="ot">(+) ::</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="cb1-3" data-line-number="3"><span class="ot">(+) ::</span> <span class="dt">Rational</span> <span class="ot">-&gt;</span> <span class="dt">Rational</span> <span class="ot">-&gt;</span> <span class="dt">Rational</span></a>
<a class="sourceLine" id="cb1-4" data-line-number="4"><span class="ot">(+) ::</span> <span class="dt">Double</span>   <span class="ot">-&gt;</span> <span class="dt">Double</span>   <span class="ot">-&gt;</span> <span class="dt">Double</span></a></code></pre></div>
</section>
<section id="basic-arithmetic-operations" class="level1">
<h1>Basic Arithmetic Operations</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','e46e0b000f8c2fbd81c0c7485591f1f2','e46e0b000f8c2fbd81c0c7485591f1f2');"><div class="answer" id="rese46e0b000f8c2fbd81c0c7485591f1f2"><code class="result">(-)</code><code> :: </code><code class="type">Num a =&gt; a -&gt; a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','32691880e90810de402a8a938730b2c3','32691880e90810de402a8a938730b2c3');"><div class="answer" id="res32691880e90810de402a8a938730b2c3"><code class="result">(*)</code><code> :: </code><code class="type">Num a =&gt; a -&gt; a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','6bb3d225e7bfb43bf512b7131629e2c4','6bb3d225e7bfb43bf512b7131629e2c4');"><div class="answer" id="res6bb3d225e7bfb43bf512b7131629e2c4"><code class="result">(/)</code><code> :: </code><code class="type">Fractional a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Fractional a</code> means that <code>a</code> is replaceable with <code>Rational</code>, <code>Float</code>, <code>Double</code>, …</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','2846e5b3ea75323664493a926103f130','2846e5b3ea75323664493a926103f130');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2846e5b3ea75323664493a926103f130" value="1 / 3 " /><br /><div class="answer" id="res2846e5b3ea75323664493a926103f130"><code class="result">0.3333333333333333</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','646ba05f64c766b607539e4d37fd8ce6','646ba05f64c766b607539e4d37fd8ce6');"><div class="answer" id="res646ba05f64c766b607539e4d37fd8ce6"><code class="result">div</code><code> :: </code><code class="type">Integral a =&gt; a -&gt; a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','c82cf2bb9e45f01563c7b48ed58efb2c','c82cf2bb9e45f01563c7b48ed58efb2c');"><div class="answer" id="resc82cf2bb9e45f01563c7b48ed58efb2c"><code class="result">mod</code><code> :: </code><code class="type">Integral a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Integral a</code> means that <code>a</code> is replaceable with <code>Int</code> and <code>Integer</code>.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','a107a1253d6508b6e2c28551898c5a8e','a107a1253d6508b6e2c28551898c5a8e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa107a1253d6508b6e2c28551898c5a8e" value="53 `mod` 5" /><br /><div class="answer" id="resa107a1253d6508b6e2c28551898c5a8e"><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_Expressions_en.hs','4e364d623c3a9a7002f023feb70fa524','4e364d623c3a9a7002f023feb70fa524');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4e364d623c3a9a7002f023feb70fa524" value="53 `div` 5" /><br /><div class="answer" id="res4e364d623c3a9a7002f023feb70fa524"><code class="result">10</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercises" class="level1">
<h1>Exercises</h1>
<p>How many seconds are there in a normal year?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_e4cf4117de12b412373f0f9c094f3e96.hs','e4cf4117de12b412373f0f9c094f3e96','e4cf4117de12b412373f0f9c094f3e96');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareae4cf4117de12b412373f0f9c094f3e96" value="" /><br /><div class="answer" id="rese4cf4117de12b412373f0f9c094f3e96"></div></form>
<p>Calculate the area of the circle with radius 1.01.<br />
(Use <code>pi</code> instead of π.)</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','33e75ff09dd601bbe69f351039152189','33e75ff09dd601bbe69f351039152189');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea33e75ff09dd601bbe69f351039152189" value="" /><br /><div class="answer" id="res33e75ff09dd601bbe69f351039152189"></div></form>
<p>Decide whether <code>23</code> divides <code>532253373</code> or not.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','34173cb38f07f89ddbebc2ac9128303f','34173cb38f07f89ddbebc2ac9128303f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea34173cb38f07f89ddbebc2ac9128303f" value="" /><br /><div class="answer" id="res34173cb38f07f89ddbebc2ac9128303f"></div></form>
</section>
<section id="raising-to-a-power" class="level1">
<h1>Raising to a Power</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','10d90cfe958bffc90133ff3f251be0e4','10d90cfe958bffc90133ff3f251be0e4');"><div class="answer" id="res10d90cfe958bffc90133ff3f251be0e4"><code class="result">(^)</code><code> :: </code><code class="type">(Integral b, Num a) =&gt; a -&gt; b -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','ec6542f8749b9e40eb3c55763bce43d3','ec6542f8749b9e40eb3c55763bce43d3');"><div class="answer" id="resec6542f8749b9e40eb3c55763bce43d3"><code class="result">(^^)</code><code> :: </code><code class="type">(Fractional a, Integral b) =&gt; a -&gt; b -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','360a605ae7c8f7c77415092cf4e33004','360a605ae7c8f7c77415092cf4e33004');"><div class="answer" id="res360a605ae7c8f7c77415092cf4e33004"><code class="result">(**)</code><code> :: </code><code class="type">Floating a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Floating a</code> means that <code>a</code> is replaceable with <code>Float</code>, <code>Double</code>, …</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','9fac37c08dc3cadd3dfc4d0c1de672d3','9fac37c08dc3cadd3dfc4d0c1de672d3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9fac37c08dc3cadd3dfc4d0c1de672d3" value="(1 + 1/10000000000) ^ 10000000000" /><br /><div class="answer" id="res9fac37c08dc3cadd3dfc4d0c1de672d3"><code class="result">2.718282043475248</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','59d12b56556e9d45181bbc4542a3ce5c','59d12b56556e9d45181bbc4542a3ce5c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea59d12b56556e9d45181bbc4542a3ce5c" value="2 ^^ (-1)" /><br /><div class="answer" id="res59d12b56556e9d45181bbc4542a3ce5c"><code class="result">0.5</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','107b2c960382910346b4f058b2d0bac7','107b2c960382910346b4f058b2d0bac7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea107b2c960382910346b4f058b2d0bac7" value="2 ** 0.5" /><br /><div class="answer" id="res107b2c960382910346b4f058b2d0bac7"><code class="result">1.4142135623730951</code><code> :: </code><code class="type">Double</code></div></form>
</section>
<section id="polymorphic-literals-and-constants" class="level1">
<h1>Polymorphic Literals and Constants</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','57546a206dcf2e507a3594c982870c4b','57546a206dcf2e507a3594c982870c4b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea57546a206dcf2e507a3594c982870c4b" value=":t 1230" /><br /><div class="answer" id="res57546a206dcf2e507a3594c982870c4b"><code class="result">1230</code><code> :: </code><code class="type">Num p =&gt; p</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','7455dea948b7079af7334af4ff9c3ca7','7455dea948b7079af7334af4ff9c3ca7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7455dea948b7079af7334af4ff9c3ca7" value=":t 1.1" /><br /><div class="answer" id="res7455dea948b7079af7334af4ff9c3ca7"><code class="result">1.1</code><code> :: </code><code class="type">Fractional p =&gt; p</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','704371baeac27c6ea06afa128446ec7d','704371baeac27c6ea06afa128446ec7d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea704371baeac27c6ea06afa128446ec7d" value=":t pi" /><br /><div class="answer" id="res704371baeac27c6ea06afa128446ec7d"><code class="result">pi</code><code> :: </code><code class="type">Floating a =&gt; a</code></div></form>
<p>Specializing the type of a polymorphic expression:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','fb2866155e12a425509e88816a506d4b','fb2866155e12a425509e88816a506d4b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafb2866155e12a425509e88816a506d4b" value="1230 :: Rational" /><br /><div class="answer" id="resfb2866155e12a425509e88816a506d4b"><code class="result">1230 :% 1</code><code> :: </code><code class="type">Rational</code></div></form>
<p>Exercises:</p>
<ol type="1">
<li>Why is <code>1 + 1.1</code> type-correct?</li>
<li>What is the type of <code>3</code> in the expression <code>(1 + 3) / 4</code>?</li>
</ol>
</section>
<section id="prelude-type-class-hierarchy" class="level1">
<h1>Prelude Type Class Hierarchy</h1>
<p><img src="FL_Expressions_en9ede53b64e93797291e1e05f90693bac.png" alt="FL_Expressions_en9ede53b64e93797291e1e05f90693bac.png" /></p>
<p>You can specialize expressions like</p>
<pre><code>(+) :: Fractional a =&gt; a -&gt; a -&gt; a</code></pre>
</section>
<section id="the-two-boolean-values" class="level1">
<h1>The Two Boolean Values</h1>
<p>Boolean values:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','c950d9656f331d04fb5e11f9583ed642','c950d9656f331d04fb5e11f9583ed642');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac950d9656f331d04fb5e11f9583ed642" value=":t True" /><br /><div class="answer" id="resc950d9656f331d04fb5e11f9583ed642"><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_Expressions_en.hs','1f0c8467ec609aa5d7f7aa0843708aa3','1f0c8467ec609aa5d7f7aa0843708aa3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1f0c8467ec609aa5d7f7aa0843708aa3" value=":t False" /><br /><div class="answer" id="res1f0c8467ec609aa5d7f7aa0843708aa3"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="equality-and-ordering" class="level1">
<h1>Equality and Ordering</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','6f032ded767e7953a2da64a5e3a55cb5','6f032ded767e7953a2da64a5e3a55cb5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6f032ded767e7953a2da64a5e3a55cb5" value=":t (==)" /><br /><div class="answer" id="res6f032ded767e7953a2da64a5e3a55cb5"><code class="result">(==)</code><code> :: </code><code class="type">Eq a =&gt; a -&gt; a -&gt; Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','2bd05a10feffbddf861d71f6d6b27da2','2bd05a10feffbddf861d71f6d6b27da2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2bd05a10feffbddf861d71f6d6b27da2" value=":t (&lt;)" /><br /><div class="answer" id="res2bd05a10feffbddf861d71f6d6b27da2"><code class="result">(&lt;)</code><code> :: </code><code class="type">Ord a =&gt; a -&gt; a -&gt; Bool</code></div></form>
<section id="exercises-1" class="level2">
<h2>Exercises</h2>
<ul>
<li>Make a conclusion on the result:</li>
</ul>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','74325e142e544b0c32a8180695ba54b5','74325e142e544b0c32a8180695ba54b5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea74325e142e544b0c32a8180695ba54b5" value="'a' &lt; 'x'" /><br /><div class="answer" id="res74325e142e544b0c32a8180695ba54b5"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','da2ac00294eb1989773346f222011869','da2ac00294eb1989773346f222011869');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareada2ac00294eb1989773346f222011869" value="&quot;foo&quot; &lt; &quot;foobar&quot;" /><br /><div class="answer" id="resda2ac00294eb1989773346f222011869"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','d250bac6e37fecd4faea6f43ff1c058f','d250bac6e37fecd4faea6f43ff1c058f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread250bac6e37fecd4faea6f43ff1c058f" value="[312,3] &lt; [312,1,3]" /><br /><div class="answer" id="resd250bac6e37fecd4faea6f43ff1c058f"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','ed46b35f6a6d783d8f3b2e0cf5793693','ed46b35f6a6d783d8f3b2e0cf5793693');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaed46b35f6a6d783d8f3b2e0cf5793693" value="[[]] &lt; [[[]]]" /><br /><div class="answer" id="resed46b35f6a6d783d8f3b2e0cf5793693"></div></form>
<ul>
<li>Write an expression that is <code>True</code> if and only if <code>23</code> does not divide <code>532253373</code>.</li>
</ul>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_2a27485274381c74d2401684e18372aa.hs','2a27485274381c74d2401684e18372aa','2a27485274381c74d2401684e18372aa');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea2a27485274381c74d2401684e18372aa" value="" /><br /><div class="answer" id="res2a27485274381c74d2401684e18372aa"></div></form>
</section>
</section>
<section id="boolean-operators" class="level1">
<h1>Boolean Operators</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','d3dea8cfbf37f3993f22ed64df5c12a2','d3dea8cfbf37f3993f22ed64df5c12a2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread3dea8cfbf37f3993f22ed64df5c12a2" value="True &amp;&amp; False" /><br /><div class="answer" id="resd3dea8cfbf37f3993f22ed64df5c12a2"><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_Expressions_en.hs','2c2bbd21e5986e01a298fe2fa2dd3351','2c2bbd21e5986e01a298fe2fa2dd3351');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2c2bbd21e5986e01a298fe2fa2dd3351" value="True || False" /><br /><div class="answer" id="res2c2bbd21e5986e01a298fe2fa2dd3351"><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_Expressions_en.hs','a65ffe811a9409c333b2e03ac8ccdeb3','a65ffe811a9409c333b2e03ac8ccdeb3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa65ffe811a9409c333b2e03ac8ccdeb3" value="not True" /><br /><div class="answer" id="resa65ffe811a9409c333b2e03ac8ccdeb3"><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_Expressions_en.hs','b908ff09243276a3f88bf9307d389bfe','b908ff09243276a3f88bf9307d389bfe');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab908ff09243276a3f88bf9307d389bfe" value=":t (&amp;&amp;)" /><br /><div class="answer" id="resb908ff09243276a3f88bf9307d389bfe"><code class="result">(&amp;&amp;)</code><code> :: </code><code class="type">Bool -&gt; Bool -&gt; Bool</code></div></form>
</section>
<section id="functions-and-operators" class="level1">
<h1>Functions and Operators</h1>
<p>Operator names may contain graphic characters: <code>+</code>, <code>**</code>, <code>&lt;=</code>, <code>!?.#$%@&amp;*+-~^/|\&lt;=&gt;</code>, etc.</p>
<p>Function names may begin with lower letter and may contain further alphanumeric characters, for example <code>sin</code>, <code>mod</code>, <code>isAlpha</code>, etc.</p>
<p>Functions with two parameters can be used with infix notation:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','13735fc9c920fe4bc27ef8f4b7c9c822','13735fc9c920fe4bc27ef8f4b7c9c822');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea13735fc9c920fe4bc27ef8f4b7c9c822" value="13 `div` 2" /><br /><div class="answer" id="res13735fc9c920fe4bc27ef8f4b7c9c822"></div></form>
<p>Operators can be used with prefix notation:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','49033683570bc7d67e419c6bd186233b','49033683570bc7d67e419c6bd186233b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea49033683570bc7d67e419c6bd186233b" value="(+) 1 2" /><br /><div class="answer" id="res49033683570bc7d67e419c6bd186233b"></div></form>
<p>Note that negation is denoted with <code>-</code> (the minus symbol), just like subtraction.<br />
However, writing <code>3 + -11</code> is erroneous, one should write <code>3 + (-11)</code> instead (note the parenthesis).</p>
</section>
<section id="precedences" class="level1">
<h1>Precedences</h1>
<p>Precedences from stronger to weaker:</p>
<table>
<tbody>
<tr class="odd">
<td style="text-align: left;">functions (<code>sqrt</code>, <code>div</code>, <code>mod</code>, etc.)</td>
<td style="text-align: center;">left: ((.).)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>^</code>, <code>^^</code>, <code>**</code></td>
<td style="text-align: center;">right: (.(.))</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>*</code>, <code>/</code>, <code>`div`</code>, <code>`mod`</code></td>
<td style="text-align: center;">left: ((.).)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>+</code>, <code>-</code> (subtraction and negation)</td>
<td style="text-align: center;">left: ((.).)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>==</code>, <code>/=</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code></td>
<td style="text-align: center;">-</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>&amp;&amp;</code></td>
<td style="text-align: center;">right: (.(.))</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>||</code></td>
<td style="text-align: center;">right: (.(.))</td>
</tr>
</tbody>
</table>
<p><em>Example.</em> <code>3 - 3 ^ 3 ^ 3 - 3</code> with parentheses added:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','2c3c86f7cd77a95737e3de33a2370621','2c3c86f7cd77a95737e3de33a2370621');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2c3c86f7cd77a95737e3de33a2370621" value="(3 - (3 ^ (3 ^ 3))) - 3" /><br /><div class="answer" id="res2c3c86f7cd77a95737e3de33a2370621"></div></form>
<p>Note that the function application has the strongest precedence.</p>
<p><code>sin pi + 1</code> is <code>(sin pi) + 1</code>.</p>
<section id="exercises-2" class="level2">
<h2>Exercises</h2>
<p>Add parentheses.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','7d7461bd5071014424461078d92b42e7','7d7461bd5071014424461078d92b42e7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7d7461bd5071014424461078d92b42e7" value="1 + 2 * 3 ** 4 / 5" /><br /><div class="answer" id="res7d7461bd5071014424461078d92b42e7"><code class="result">33.4</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','6273185c161c1214009df13e05e62e7e','6273185c161c1214009df13e05e62e7e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6273185c161c1214009df13e05e62e7e" value="6 &lt; 4 || 4 &gt;= 5 &amp;&amp; 12 /= 4 * 4" /><br /><div class="answer" id="res6273185c161c1214009df13e05e62e7e"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
</section>
<section id="lists" class="level1">
<h1>Lists</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','3825bc2e2883f2315c3fe80e4e3ad57d','3825bc2e2883f2315c3fe80e4e3ad57d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3825bc2e2883f2315c3fe80e4e3ad57d" value="[True, False, False] :: [Bool]" /><br /><div class="answer" id="res3825bc2e2883f2315c3fe80e4e3ad57d"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','804661dbe2f61ba501adbba5eac65d04','804661dbe2f61ba501adbba5eac65d04');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea804661dbe2f61ba501adbba5eac65d04" value="[1, 2, 3]            :: Num a =&gt; [a]" /><br /><div class="answer" id="res804661dbe2f61ba501adbba5eac65d04"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','fb740d6e001ba6c85bfc30b6308f3c66','fb740d6e001ba6c85bfc30b6308f3c66');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafb740d6e001ba6c85bfc30b6308f3c66" value="[]                   :: [a]" /><br /><div class="answer" id="resfb740d6e001ba6c85bfc30b6308f3c66"></div></form>
<p>Sometimes list may be used as sets, but an important different between them is that order and multiplicity matter for lists.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','e7ea9d4a3dc109807077c7602bbde066','e7ea9d4a3dc109807077c7602bbde066');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae7ea9d4a3dc109807077c7602bbde066" value="[1, 2, 3] /= [3, 2, 1]" /><br /><div class="answer" id="rese7ea9d4a3dc109807077c7602bbde066"><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_Expressions_en.hs','0b1c9609b64190dbfbd3d6a7d83e158c','0b1c9609b64190dbfbd3d6a7d83e158c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0b1c9609b64190dbfbd3d6a7d83e158c" value="[1, 1] /= [1]" /><br /><div class="answer" id="res0b1c9609b64190dbfbd3d6a7d83e158c"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<p>Lists are homogeneous, that is, all elements should have the same type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','fc8c981b213f0e29c1f5245b9e450492','fc8c981b213f0e29c1f5245b9e450492');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafc8c981b213f0e29c1f5245b9e450492" value="[1, True]" /><br /><div class="answer" id="resfc8c981b213f0e29c1f5245b9e450492"><div class="error"><pre class="normal">&lt;interactive&gt;:1:2: error:
    &#8226; No instance for (Num Bool) arising from the literal &#8216;1&#8217;
    &#8226; In the expression: 1
      In the expression: [1, True]
</pre></div></div></form>
<p>A string is a list of characters.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','761002dd4d3b1c5ac22bbea490c7ded8','761002dd4d3b1c5ac22bbea490c7ded8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea761002dd4d3b1c5ac22bbea490c7ded8" value="['a', 'b', 'c']" /><br /><div class="answer" id="res761002dd4d3b1c5ac22bbea490c7ded8"><code class="result">&quot;abc&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p><code>String</code> a synonym for <code>[Char]</code>.</p>
</section>
<section id="dotdot-expressions" class="level1">
<h1>Dotdot Expressions</h1>
<p>There are four different forms:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','706b67cdcf4a2b1f7e91fed852e833ea','706b67cdcf4a2b1f7e91fed852e833ea');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea706b67cdcf4a2b1f7e91fed852e833ea" value="[1..10]" /><br /><div class="answer" id="res706b67cdcf4a2b1f7e91fed852e833ea"><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_Expressions_en.hs','b774fc822f5eb3e6a03319603ea66e01','b774fc822f5eb3e6a03319603ea66e01');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab774fc822f5eb3e6a03319603ea66e01" value="[1,3..10]" /><br /><div class="answer" id="resb774fc822f5eb3e6a03319603ea66e01"><code class="result">[1, 3, 5, 7, 9]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','064aae8bff4bd5966f48c9cd2f4fbae5','064aae8bff4bd5966f48c9cd2f4fbae5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea064aae8bff4bd5966f48c9cd2f4fbae5" value="[1..]" /><br /><div class="answer" id="res064aae8bff4bd5966f48c9cd2f4fbae5"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','9c9e59fd5b4c128abeda583be44e58f5','9c9e59fd5b4c128abeda583be44e58f5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9c9e59fd5b4c128abeda583be44e58f5" value="[1,3..]" /><br /><div class="answer" id="res9c9e59fd5b4c128abeda583be44e58f5"></div></form>
<p>This is also possible:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','62a45f7f0d802c7e89936a4be0729f41','62a45f7f0d802c7e89936a4be0729f41');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea62a45f7f0d802c7e89936a4be0729f41" value="['a'..'z']" /><br /><div class="answer" id="res62a45f7f0d802c7e89936a4be0729f41"><code class="result">&quot;abcdefghijklmnopqrstuvwxyz&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<section id="exercise" class="level2">
<h2>Exercise</h2>
<p>List the numbers from <code>10</code> to <code>-10</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_4e6157523ffc832ffa453dd4116773a0.hs','4e6157523ffc832ffa453dd4116773a0','4e6157523ffc832ffa453dd4116773a0');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea4e6157523ffc832ffa453dd4116773a0" value="" /><br /><div class="answer" id="res4e6157523ffc832ffa453dd4116773a0"></div></form>
</section>
<section id="exercises-3" class="level2">
<h2>Exercises</h2>
<p>Guess the type of the following expressions:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','4f6258e96783b125cf9d40d8cc3c0e1d','4f6258e96783b125cf9d40d8cc3c0e1d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4f6258e96783b125cf9d40d8cc3c0e1d" value=":t [[]]" /><br /><div class="answer" id="res4f6258e96783b125cf9d40d8cc3c0e1d"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','884ee2fdeefdc7123e4340444733cd76','884ee2fdeefdc7123e4340444733cd76');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea884ee2fdeefdc7123e4340444733cd76" value=":t [True, False, [False], True]" /><br /><div class="answer" id="res884ee2fdeefdc7123e4340444733cd76"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','dba56cfaf0ca043fe5c4b33ac7b13cce','dba56cfaf0ca043fe5c4b33ac7b13cce');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadba56cfaf0ca043fe5c4b33ac7b13cce" value=":t &quot;appl&quot; ++ ['e']" /><br /><div class="answer" id="resdba56cfaf0ca043fe5c4b33ac7b13cce"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','87399e9c09f4faa2e655204834e7e1bb','87399e9c09f4faa2e655204834e7e1bb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea87399e9c09f4faa2e655204834e7e1bb" value=":t length [] ++ [1]" /><br /><div class="answer" id="res87399e9c09f4faa2e655204834e7e1bb"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','b8182fd9d95a365ff44611802c4f5867','b8182fd9d95a365ff44611802c4f5867');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab8182fd9d95a365ff44611802c4f5867" value=":t [[1,2],[3,4]] ++ [] ++ [[]] ++ [[[]]]" /><br /><div class="answer" id="resb8182fd9d95a365ff44611802c4f5867"></div></form>
</section>
</section>
<section id="some-basic-operations-on-lists" class="level1">
<h1>Some Basic Operations on Lists</h1>
<p>The <code>length</code> function returns the number of elements in a list.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','4d10e3aff615f482c522da5e5ddda0c0','4d10e3aff615f482c522da5e5ddda0c0');"><div class="answer" id="res4d10e3aff615f482c522da5e5ddda0c0"><code class="result">length</code><code> :: </code><code class="type">[a] -&gt; Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','c954808f44a228fbf56a03af5ee42f9e','c954808f44a228fbf56a03af5ee42f9e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac954808f44a228fbf56a03af5ee42f9e" value="length [4,7,8]" /><br /><div class="answer" id="resc954808f44a228fbf56a03af5ee42f9e"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
<p>The <code>!!</code> operator selects an element from a list with the given index. The first element of the list has the index <code>0</code>. Passing negative indexes results an error.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','f2bdb467d07003e8e8effc878db63950','f2bdb467d07003e8e8effc878db63950');"><div class="answer" id="resf2bdb467d07003e8e8effc878db63950"><code class="result">(!!)</code><code> :: </code><code class="type">[a] -&gt; Int -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','6485574ec3cadf49cbfc4edd6ebff596','6485574ec3cadf49cbfc4edd6ebff596');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6485574ec3cadf49cbfc4edd6ebff596" value="['a','b','c'] !! 1" /><br /><div class="answer" id="res6485574ec3cadf49cbfc4edd6ebff596"><code class="result">'b'</code><code> :: </code><code class="type">Char</code></div></form>
<p>The <code>++</code> (concatenate) operator combines two lists. Note that both lists must be of the same type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','d8228171a1501c5491df3ac0197352ad','d8228171a1501c5491df3ac0197352ad');"><div class="answer" id="resd8228171a1501c5491df3ac0197352ad"><code class="result">(++)</code><code> :: </code><code class="type">[a] -&gt; [a] -&gt; [a]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','ed416673428fb2c808f084f33f136291','ed416673428fb2c808f084f33f136291');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaed416673428fb2c808f084f33f136291" value="&quot;he&quot; ++ &quot;llo&quot;" /><br /><div class="answer" id="resed416673428fb2c808f084f33f136291"><code class="result">&quot;hello&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p>The <code>:</code> (cons) operator adds exactly one element to the head of the list. Note that the types must be the same.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','9a76e7340275a2db9f77f1ed73a31583','9a76e7340275a2db9f77f1ed73a31583');"><div class="answer" id="res9a76e7340275a2db9f77f1ed73a31583"><code class="result">(:)</code><code> :: </code><code class="type">a -&gt; [a] -&gt; [a]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','3524083425a3273070dbaa0127839215','3524083425a3273070dbaa0127839215');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3524083425a3273070dbaa0127839215" value="11 : [12,13,14]" /><br /><div class="answer" id="res3524083425a3273070dbaa0127839215"><code class="result">[11, 12, 13, 14]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<section id="exercise-1" class="level2">
<h2>Exercise</h2>
<p>What is the 113th element of the arithmetic sequence whose first two elements are 11 and 32?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_4170daa26e8081746d262d6e73a3b369.hs','4170daa26e8081746d262d6e73a3b369','4170daa26e8081746d262d6e73a3b369');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea4170daa26e8081746d262d6e73a3b369" value="" /><br /><div class="answer" id="res4170daa26e8081746d262d6e73a3b369"></div></form>
</section>
</section>
<section id="sum-and-product" class="level1">
<h1>Sum and Product</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','ccd00dccea9e5ac0cf700df698a2c030','ccd00dccea9e5ac0cf700df698a2c030');"><div class="answer" id="resccd00dccea9e5ac0cf700df698a2c030"><code class="result">sum</code><code> :: </code><code class="type">(Foldable t, Num a) =&gt; t a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','905e4d0598ce40586228f2f274f00d75','905e4d0598ce40586228f2f274f00d75');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea905e4d0598ce40586228f2f274f00d75" value="sum [1..10]" /><br /><div class="answer" id="res905e4d0598ce40586228f2f274f00d75"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','7eb9ecdd4ac22e230a82165322012e2b','7eb9ecdd4ac22e230a82165322012e2b');"><div class="answer" id="res7eb9ecdd4ac22e230a82165322012e2b"><code class="result">product</code><code> :: </code><code class="type">(Foldable t, Num a) =&gt; t a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','c040922b5e1a651c280afab28c25263b','c040922b5e1a651c280afab28c25263b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac040922b5e1a651c280afab28c25263b" value="product [1..10]" /><br /><div class="answer" id="resc040922b5e1a651c280afab28c25263b"></div></form>
<section id="exercise-2" class="level2">
<h2>Exercise</h2>
<p>How many ways can 100 different items be sorted?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_65d1a57fe5902a75c92b58def838713f.hs','65d1a57fe5902a75c92b58def838713f','65d1a57fe5902a75c92b58def838713f');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea65d1a57fe5902a75c92b58def838713f" value="" /><br /><div class="answer" id="res65d1a57fe5902a75c92b58def838713f"></div></form>
</section>
<section id="exercise-3" class="level2">
<h2>Exercise</h2>
<p>How many ways can 30 elements be chosen from 70 different elements?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_43b62a50a522affe4f94ea546d7ebeaf.hs','43b62a50a522affe4f94ea546d7ebeaf','43b62a50a522affe4f94ea546d7ebeaf');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea43b62a50a522affe4f94ea546d7ebeaf" value="" /><br /><div class="answer" id="res43b62a50a522affe4f94ea546d7ebeaf"></div></form>
<p>Hint: Use the <code>div</code> function instead of <code>(/)</code>.</p>
</section>
<section id="exercise-4" class="level2">
<h2>Exercise</h2>
<p>What is easier: get 5 elements out of 90 or get 6 elements out of 45?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','7ef605fc8dba5425d6965fbd4c8fbe1f','7ef605fc8dba5425d6965fbd4c8fbe1f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7ef605fc8dba5425d6965fbd4c8fbe1f" value="" /><br /><div class="answer" id="res7ef605fc8dba5425d6965fbd4c8fbe1f"></div></form>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','a8f15eda80c50adb0e71943adc8015cf','a8f15eda80c50adb0e71943adc8015cf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa8f15eda80c50adb0e71943adc8015cf" value="" /><br /><div class="answer" id="resa8f15eda80c50adb0e71943adc8015cf"></div></form>
</section>
</section>
<section id="list-comprehensions" class="level1">
<h1>List Comprehensions</h1>
<p>List comprehensions provide a convenient syntactical mechanism to create lists. The syntax is similar to the mathematical set notation.</p>
<p>In Math: { 2 × n | n ∈ N }</p>
<p>In English: for all n in the naturals, two times n</p>
<p>In Haskell:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','8fe9eb798319dfd605f1c9f1ee40a74d','8fe9eb798319dfd605f1c9f1ee40a74d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8fe9eb798319dfd605f1c9f1ee40a74d" value="[ 2*n | n &lt;- [1..] ]" /><br /><div class="answer" id="res8fe9eb798319dfd605f1c9f1ee40a74d"><code class="result">[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34,
 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68,
 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100,
 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126,
 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152,
 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178,
 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204,
 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230,
 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, &#8230;&#8230;]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<p>The members of the input list can be selectively tested with <code>Bool</code>-typed expressions, separated by commas.</p>
<p>In Math: { n<sup>2</sup> | n ∈ N, n even }</p>
<p>In Haskell:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','513f08aeae636bdb582c6a58d2ac7540','513f08aeae636bdb582c6a58d2ac7540');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea513f08aeae636bdb582c6a58d2ac7540" value="[ n^2 | n &lt;- [1..], even n ]" /><br /><div class="answer" id="res513f08aeae636bdb582c6a58d2ac7540"><code class="result">[4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784,
 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500,
 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184,
 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836,
 9216, 9604, 10000, 10404, 10816, 11236, 11664, 12100, 12544, 12996,
 13456, 13924, 14400, 14884, 15376, 15876, 16384, 16900, 17424,
 17956, 18496, 19044, 19600, 20164, 20736, 21316, 21904, 22500,
 23104, 23716, 24336, 24964, 25600, 26244, 26896, 27556, 28224,
 28900, 29584, 30276, 30976, 31684, 32400, 33124, 33856, 34596,
 35344, 36100, 36864, &#8230;, &#8230;&#8230;]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<section id="exercise-5" class="level2">
<h2>Exercise</h2>
<p>List powers of 2 from 1 to 2<sup>10</sup>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_975697344340f09af0ce6def7e2f6e50.hs','975697344340f09af0ce6def7e2f6e50','975697344340f09af0ce6def7e2f6e50');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea975697344340f09af0ce6def7e2f6e50" value="" /><br /><div class="answer" id="res975697344340f09af0ce6def7e2f6e50"></div></form>
</section>
<section id="exercise-6" class="level2">
<h2>Exercise</h2>
<p>Generate a list of length 10 whose elements are <code>False</code>, <code>True</code>, <code>False</code>, <code>True</code>, … (alternating)</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_22279d6ccae71e224b13cbb5d7b0af99.hs','22279d6ccae71e224b13cbb5d7b0af99','22279d6ccae71e224b13cbb5d7b0af99');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea22279d6ccae71e224b13cbb5d7b0af99" value="" /><br /><div class="answer" id="res22279d6ccae71e224b13cbb5d7b0af99"></div></form>
</section>
<section id="exercise-7" class="level2">
<h2>Exercise</h2>
<p>Construct the least power of 2 which is bigger than 10<sup>20</sup>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_ab596085879637845497fcd20dce7400.hs','ab596085879637845497fcd20dce7400','ab596085879637845497fcd20dce7400');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareaab596085879637845497fcd20dce7400" value="" /><br /><div class="answer" id="resab596085879637845497fcd20dce7400"></div></form>
<p>Hint: <code>xs !! 0  ==  head xs</code>.</p>
</section>
<section id="exercise-8" class="level2">
<h2>Exercise</h2>
<p>List the divisors of <span class="math inline">60</span>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_c4a0d7f0991ce08c8ac8ff59d3e2f70d.hs','c4a0d7f0991ce08c8ac8ff59d3e2f70d','c4a0d7f0991ce08c8ac8ff59d3e2f70d');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareac4a0d7f0991ce08c8ac8ff59d3e2f70d" value="" /><br /><div class="answer" id="resc4a0d7f0991ce08c8ac8ff59d3e2f70d"></div></form>
</section>
<section id="exercise-9" class="level2">
<h2>Exercise</h2>
<p>How many divisors does <span class="math inline">60</span> have?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_0c2fcdcaea1489ab43c7b966be569c85.hs','0c2fcdcaea1489ab43c7b966be569c85','0c2fcdcaea1489ab43c7b966be569c85');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea0c2fcdcaea1489ab43c7b966be569c85" value="" /><br /><div class="answer" id="res0c2fcdcaea1489ab43c7b966be569c85"></div></form>
</section>
<section id="exercise-10" class="level2">
<h2>Exercise</h2>
<p>Is <span class="math inline">123457</span> a prime number?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_51e47fff75e61531ca9196dc7e883bb7.hs','51e47fff75e61531ca9196dc7e883bb7','51e47fff75e61531ca9196dc7e883bb7');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea51e47fff75e61531ca9196dc7e883bb7" value="" /><br /><div class="answer" id="res51e47fff75e61531ca9196dc7e883bb7"></div></form>
</section>
<section id="exercise-11" class="level2">
<h2>Exercise</h2>
<p>Generate the following list: <code>[1,1,2,1,2,3,1,2,3,4,</code>…<code>]</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_fa697efbd9d42418b0b9de72c9f4a68b.hs','fa697efbd9d42418b0b9de72c9f4a68b','fa697efbd9d42418b0b9de72c9f4a68b');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareafa697efbd9d42418b0b9de72c9f4a68b" value="" /><br /><div class="answer" id="resfa697efbd9d42418b0b9de72c9f4a68b"></div></form>
</section>
<section id="exercise-12" class="level2">
<h2>Exercise</h2>
<p>Generate the following sequence (as a list): 0,1,0,-1,0,1,2,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,…</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_555d6e84d029d6d258c9e538ca64f12c.hs','555d6e84d029d6d258c9e538ca64f12c','555d6e84d029d6d258c9e538ca64f12c');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea555d6e84d029d6d258c9e538ca64f12c" value="" /><br /><div class="answer" id="res555d6e84d029d6d258c9e538ca64f12c"></div></form>
<p>Hint: Use <code>concat</code>.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','341d5533c6977e975157011f50fd71e7','341d5533c6977e975157011f50fd71e7');"><div class="answer" id="res341d5533c6977e975157011f50fd71e7"><code class="result">concat</code><code> :: </code><code class="type">Foldable t =&gt; t [a] -&gt; [a]</code></div></form>
</section>
</section>
<section id="pairs" class="level1">
<h1>Pairs</h1>
<p><em>Pairs</em> may have two elements with different types:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','c470b084eabbfd12f32ddb25ca583ff1','c470b084eabbfd12f32ddb25ca583ff1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac470b084eabbfd12f32ddb25ca583ff1" value=":t (True, 'a')" /><br /><div class="answer" id="resc470b084eabbfd12f32ddb25ca583ff1"><code class="result">(True, 'a')</code><code> :: </code><code class="type">(Bool, Char)</code></div></form>
<p>A list comprehension which produces a list of pairs:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','f1fed0a8e34540f4ce580bc0e59884dd','f1fed0a8e34540f4ce580bc0e59884dd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf1fed0a8e34540f4ce580bc0e59884dd" value="[(a,b) | a&lt;-&quot;abc&quot;, b&lt;-[1,2]] " /><br /><div class="answer" id="resf1fed0a8e34540f4ce580bc0e59884dd"><code class="result">[('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)]</code><code> :: </code><code class="type">[(Char, Integer)]</code></div></form>
<section id="exercise-13" class="level2">
<h2>Exercise</h2>
<p>Generate a list that contains all (hour, minute) pairs in a day.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_6574d971c9739158dea9ba5a36232562.hs','6574d971c9739158dea9ba5a36232562','6574d971c9739158dea9ba5a36232562');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea6574d971c9739158dea9ba5a36232562" value="" /><br /><div class="answer" id="res6574d971c9739158dea9ba5a36232562"></div></form>
</section>
<section id="exercise-14" class="level2">
<h2>Exercise</h2>
<p>List “dominoes”:</p>
<pre><code>[(0,0),(0,1),(1,1),(0,2),(1,2),(2,2),...,(9,9)]</code></pre>
<p>Domino <code>(1,0)</code> is not in the list because it is already in it as <code>(0,1)</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_1c8285376eb6f9db0c02e477d850cf2b.hs','1c8285376eb6f9db0c02e477d850cf2b','1c8285376eb6f9db0c02e477d850cf2b');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea1c8285376eb6f9db0c02e477d850cf2b" value="" /><br /><div class="answer" id="res1c8285376eb6f9db0c02e477d850cf2b"></div></form>
<p>More generally, <em>tuples</em> may contain an arbitrary number of elements of different types.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','eeb04311d5aeef8bfa5cbaf8f02d0416','eeb04311d5aeef8bfa5cbaf8f02d0416');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaeeb04311d5aeef8bfa5cbaf8f02d0416" value="(True, &quot;hello&quot;, 3.4)" /><br /><div class="answer" id="reseeb04311d5aeef8bfa5cbaf8f02d0416"><code class="result">(True, &quot;hello&quot;, 3.4)</code><code> :: </code><code class="type">(Bool, [Char], Double)</code></div></form>
</section>
<section id="exercise-15" class="level2">
<h2>Exercise</h2>
<p>Find all Boolean values <code>a</code>, <code>b</code>, and <code>c</code> such that</p>
<pre><code>(a || (b &amp;&amp; c)) /= ((a || b) &amp;&amp; c)</code></pre>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_270b1796d0ebd1db63cd2027ab28f0a5.hs','270b1796d0ebd1db63cd2027ab28f0a5','270b1796d0ebd1db63cd2027ab28f0a5');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea270b1796d0ebd1db63cd2027ab28f0a5" value="" /><br /><div class="answer" id="res270b1796d0ebd1db63cd2027ab28f0a5"></div></form>
<p>The type of the result should be <code>[(Bool,Bool,Bool)]</code>.</p>
</section>
<section id="exercise-16" class="level2">
<h2>Exercise</h2>
<p>Generate a list that contains all (month, day) pairs in a 365-day year.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_2c9d314f30a9b65ea63b37287d8e0e02.hs','2c9d314f30a9b65ea63b37287d8e0e02','2c9d314f30a9b65ea63b37287d8e0e02');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea2c9d314f30a9b65ea63b37287d8e0e02" value="" /><br /><div class="answer" id="res2c9d314f30a9b65ea63b37287d8e0e02"></div></form>
<p>Hint: It is easier with the <code>elem</code> function.</p>
</section>
</section>
<section id="zipping" class="level1">
<h1>Zipping</h1>
<p>The function <code>zip</code> zips two lists together. The result is a list of tuples, where the first element of each tuple is taken from the first list, and the second element of each tuple is taken from the corresponding element of the second list.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','afb2e6e8bd9fd1b86400672071487fc9','afb2e6e8bd9fd1b86400672071487fc9');"><div class="answer" id="resafb2e6e8bd9fd1b86400672071487fc9"><code class="result">zip</code><code> :: </code><code class="type">[a] -&gt; [b] -&gt; [(a, b)]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','57b2c967e0369f9099bc482fc75398fb','57b2c967e0369f9099bc482fc75398fb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea57b2c967e0369f9099bc482fc75398fb" value="zip &quot;abc&quot; [1,2]" /><br /><div class="answer" id="res57b2c967e0369f9099bc482fc75398fb"><code class="result">[('a', 1), ('b', 2)]</code><code> :: </code><code class="type">[(Char, Integer)]</code></div></form>
<p>Zipping is finished if one of the lists ends.</p>
<section id="exercise-17" class="level2">
<h2>Exercise</h2>
<p>Construct the list <code>[(1,'a'),(2,'b'),</code>…<code>(</code>…<code>,'z')]</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_5571fa5bb2a54473355363b2d9726dd0.hs','5571fa5bb2a54473355363b2d9726dd0','5571fa5bb2a54473355363b2d9726dd0');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea5571fa5bb2a54473355363b2d9726dd0" value="" /><br /><div class="answer" id="res5571fa5bb2a54473355363b2d9726dd0"></div></form>
<p><em>Hint.</em> Use two dotdot expressions!</p>
</section>
</section>
<section id="further-exercises-with-list-comprehensions" class="level1">
<h1>Further Exercises with List Comprehensions</h1>
<section id="exercise-18" class="level2">
<h2>Exercise</h2>
<p>Generate the following list: <code>[1,2,2,3,3,3,4,4,4,4,</code> …<code>]</code>. The <em>i</em>th number appears <em>i</em> times in the list.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_c2a7269db2ffbf01e503e19ee85bc3be.hs','c2a7269db2ffbf01e503e19ee85bc3be','c2a7269db2ffbf01e503e19ee85bc3be');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareac2a7269db2ffbf01e503e19ee85bc3be" value="" /><br /><div class="answer" id="resc2a7269db2ffbf01e503e19ee85bc3be"></div></form>
</section>
<section id="exercise-19" class="level2">
<h2>Exercise</h2>
<p>Test the <code>concat</code> function. <code>concat</code> will combine two lists.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','5c7a05c8bca95e3627243ea5f3f7bfb2','5c7a05c8bca95e3627243ea5f3f7bfb2');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5c7a05c8bca95e3627243ea5f3f7bfb2" value=":t concat" /><br /><div class="answer" id="res5c7a05c8bca95e3627243ea5f3f7bfb2"><code class="result">concat</code><code> :: </code><code class="type">Foldable t =&gt; t [a] -&gt; [a]</code></div></form>
<p>Generate the following sequence: 1,2,1,2,3,2,1,2,3,4,3,2,1,2,3,4,5,4,3,2,1,2,3,4,5,6,5,4,3,2,1,…</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_2766934b1900b6e44bc953c3b575548d.hs','2766934b1900b6e44bc953c3b575548d','2766934b1900b6e44bc953c3b575548d');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea2766934b1900b6e44bc953c3b575548d" value="" /><br /><div class="answer" id="res2766934b1900b6e44bc953c3b575548d"></div></form>
</section>
<section id="exercise-20" class="level2">
<h2>Exercise</h2>
<p>Test the <code>unwords</code> function.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en.hs','c501b71f711116a189ef13e01d5ece2f','c501b71f711116a189ef13e01d5ece2f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac501b71f711116a189ef13e01d5ece2f" value=":t unwords" /><br /><div class="answer" id="resc501b71f711116a189ef13e01d5ece2f"><code class="result">unwords</code><code> :: </code><code class="type">[String] -&gt; String</code></div></form>
<p>Generate the following infinite string: <code>&quot;* ** *** **** *****</code>…</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_23b1f62dbe384bbe5012108e8cfbb03f.hs','23b1f62dbe384bbe5012108e8cfbb03f','23b1f62dbe384bbe5012108e8cfbb03f');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea23b1f62dbe384bbe5012108e8cfbb03f" value="" /><br /><div class="answer" id="res23b1f62dbe384bbe5012108e8cfbb03f"></div></form>
</section>
<section id="exercise-21" class="level2">
<h2>Exercise</h2>
<p>Generate a list that is derived from the set of natural numbers by omitting the square numbers.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=FL_Expressions_en_d0b56ed4631d23a92c5165fe963da5ac.hs','d0b56ed4631d23a92c5165fe963da5ac','d0b56ed4631d23a92c5165fe963da5ac');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="taread0b56ed4631d23a92c5165fe963da5ac" value="" /><br /><div class="answer" id="resd0b56ed4631d23a92c5165fe963da5ac"></div></form>
</section>
</section>
</body>
</html>

