<?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>List Comprehensions</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">List Comprehensions</h1>
<div id="info"></div>
<ul>
<li><a href="#list-comprehensions">List Comprehensions</a></li>
<li><a href="#exercise-powers-of-2">Exercise: Powers of 2</a></li>
<li><a href="#exercise-double-of-the-first-10-square-numbers">Exercise: Double of the First 10 Square Numbers</a></li>
<li><a href="#exercise-false-and-true-repeated">Exercise: <code>False</code> and <code>True</code> Repeated</a></li>
<li><a href="#exercise-searching-power-of-2-big-enough">Exercise: Searching Power of 2 Big Enough</a></li>
<li><a href="#exercise-1024-1000">Exercise: 1024 &gt; 1000, …</a></li>
<li><a href="#exercise-divisors-of-60">Exercise: Divisors of 60</a></li>
<li><a href="#exercise-number-of-divisors">Exercise: Number of Divisors</a></li>
<li><a href="#exercise-prime-test">Exercise: Prime Test</a></li>
<li><a href="#exercise-hours-and-minutes">Exercise: Hours and Minutes</a></li>
<li><a href="#exercise-1121231234">Exercise: 1,1,2,1,2,3,1,2,3,4,…</a></li>
<li><a href="#exercise-010-101210-1-2-10123210-1">Exercise: 0,1,0,-1,0,1,2,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,…</a></li>
<li><a href="#exercise-month-and-days">Exercise: Month and Days</a></li>
<li><a href="#exercise-table">Exercise: Table</a></li>
<li><a href="#exercise-pattern-from-small-circles">Exercise: Pattern from Small Circles</a></li>
<li><a href="#exercise-chess-table">Exercise: Chess Table</a></li>
<li><a href="#tuples">Tuples</a></li>
<li><a href="#zipping">Zipping</a></li>
<li><a href="#exercise-numbering">Exercise: Numbering</a></li>
<li><a href="#exercise-dominoes">Exercise: Dominoes</a></li>
<li><a href="#exercise-precedence-of-and-and-or">Exercise: Precedence of AND and OR</a></li>
<li><a href="#exercises-with-infinite-lists">Exercises with Infinite Lists</a></li>
<li><a href="#exercise-all-pairs-of-natural-numbers">Exercise: All Pairs of Natural Numbers</a></li>
<li><a href="#exercise-1-2-2-3-3-3">Exercise: 1, 2, 2, 3, 3, 3, …</a></li>
<li><a href="#exercise-1-2-1-2-3-2-1">Exercise: 1, 2, 1, 2, 3, 2, 1, …</a></li>
<li><a href="#exercise-stars">Exercise: Stars</a></li>
<li><a href="#exercise-omitting-square-numbers">Exercise: Omitting Square Numbers</a></li>
<li><a href="#exercise-finding-an-arithmetic-sequence">Exercise: Finding an Arithmetic Sequence</a></li>
</ul>
</div>
<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 <em>n</em> in the naturals, two times <em>n</em></p>
<p>In Haskell:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','4ce802e98d0e079cd6f4d50746f66bc0','4ce802e98d0e079cd6f4d50746f66bc0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4ce802e98d0e079cd6f4d50746f66bc0" value="[ 2*n | n &lt;- [1..] ]" /><br /><div class="answer" id="res4ce802e98d0e079cd6f4d50746f66bc0"><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=Comprehensions_en.hs','ef93cc6427f16b7797ce2f0a3d61ea6d','ef93cc6427f16b7797ce2f0a3d61ea6d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaef93cc6427f16b7797ce2f0a3d61ea6d" value="[ n^2 | n &lt;- [1..], n `mod` 2 == 0 ]" /><br /><div class="answer" id="resef93cc6427f16b7797ce2f0a3d61ea6d"><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>
<div class="handout">
<hr />
<ul>
<li>Abitrary number of generators and conditions.</li>
<li>Unlike sets, the same element may appear many times and the ordering matters.</li>
<li>New variables introduced by generators are only visible to the right (and before the <code>|</code> symbol).</li>
</ul>
<p>That is, the following expression is invalid.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','9c38fe1ea02360fee7f23f52230f209c','9c38fe1ea02360fee7f23f52230f209c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9c38fe1ea02360fee7f23f52230f209c" value="[ n^2 | even n, n &lt;- [1..] ]" /><br /><div class="answer" id="res9c38fe1ea02360fee7f23f52230f209c"><div class="error"><pre class="normal">&lt;interactive&gt;:1:14: error: Variable not in scope: n :: Integer
</pre></div></div></form>
</div>
</section>
<section id="exercise-powers-of-2" class="level1">
<h1>Exercise: Powers of 2</h1>
<p>List powers of 2 from 2<sup>0</sup> to 2<sup>10</sup> in ascending order.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_c089fbbd12e2504c7c60f4fc9927418f.hs','c089fbbd12e2504c7c60f4fc9927418f','c089fbbd12e2504c7c60f4fc9927418f');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareac089fbbd12e2504c7c60f4fc9927418f" value="" /><br /><div class="answer" id="resc089fbbd12e2504c7c60f4fc9927418f"></div></form>
</section>
<section id="exercise-double-of-the-first-10-square-numbers" class="level1">
<h1>Exercise: Double of the First 10 Square Numbers</h1>
<p>List the double of the first 10 square numbers.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_e81965854933b895ea9968504326792e.hs','e81965854933b895ea9968504326792e','e81965854933b895ea9968504326792e');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareae81965854933b895ea9968504326792e" value="" /><br /><div class="answer" id="rese81965854933b895ea9968504326792e"></div></form>
</section>
<section id="exercise-false-and-true-repeated" class="level1">
<h1>Exercise: <code>False</code> and <code>True</code> Repeated</h1>
<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=Comprehensions_en_1f1f25c58c8fbaf50c9e1bbc39167287.hs','1f1f25c58c8fbaf50c9e1bbc39167287','1f1f25c58c8fbaf50c9e1bbc39167287');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea1f1f25c58c8fbaf50c9e1bbc39167287" value="" /><br /><div class="answer" id="res1f1f25c58c8fbaf50c9e1bbc39167287"></div></form>
</section>
<section id="exercise-searching-power-of-2-big-enough" class="level1">
<h1>Exercise: Searching Power of 2 Big Enough</h1>
<p>Which is the least power of 2 which is bigger than 10<sup>20</sup>?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_866ca3f77b8d73391432cc338a4abb44.hs','866ca3f77b8d73391432cc338a4abb44','866ca3f77b8d73391432cc338a4abb44');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea866ca3f77b8d73391432cc338a4abb44" value="" /><br /><div class="answer" id="res866ca3f77b8d73391432cc338a4abb44"></div></form>
<p>Hint: Use the <code>head</code> function:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','4da356b249953c20377c75d483263851','4da356b249953c20377c75d483263851');"><div class="answer" id="res4da356b249953c20377c75d483263851"><code class="result">head</code><code> :: </code><code class="type">[a] -&gt; a</code></div></form>
</section>
<section id="exercise-1024-1000" class="level1">
<h1>Exercise: 1024 &gt; 1000, …</h1>
<p>Which is the least natural number <code>n</code> for which 1024<sup>n</sup> &gt; 2 * 1000<sup>n</sup>?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_af198b97661f47ac9ddda3ce36b8dfbb.hs','af198b97661f47ac9ddda3ce36b8dfbb','af198b97661f47ac9ddda3ce36b8dfbb');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf198b97661f47ac9ddda3ce36b8dfbb" value="" /><br /><div class="answer" id="resaf198b97661f47ac9ddda3ce36b8dfbb"></div></form>
</section>
<section id="exercise-divisors-of-60" class="level1">
<h1>Exercise: Divisors of 60</h1>
<p>List the divisors of 60.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_e3ffaf2bc0ff1728628885502979fb1b.hs','e3ffaf2bc0ff1728628885502979fb1b','e3ffaf2bc0ff1728628885502979fb1b');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareae3ffaf2bc0ff1728628885502979fb1b" value="" /><br /><div class="answer" id="rese3ffaf2bc0ff1728628885502979fb1b"></div></form>
</section>
<section id="exercise-number-of-divisors" class="level1">
<h1>Exercise: Number of Divisors</h1>
<p>How many divisors does 60 have?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_697922ac8d941a4ca5b2963be8054c09.hs','697922ac8d941a4ca5b2963be8054c09','697922ac8d941a4ca5b2963be8054c09');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea697922ac8d941a4ca5b2963be8054c09" value="" /><br /><div class="answer" id="res697922ac8d941a4ca5b2963be8054c09"></div></form>
</section>
<section id="exercise-prime-test" class="level1">
<h1>Exercise: Prime Test</h1>
<p>Is 123457 a prime number?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_15674872709ef40a1581c52f2d3ab8a8.hs','15674872709ef40a1581c52f2d3ab8a8','15674872709ef40a1581c52f2d3ab8a8');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea15674872709ef40a1581c52f2d3ab8a8" value="" /><br /><div class="answer" id="res15674872709ef40a1581c52f2d3ab8a8"></div></form>
</section>
<section id="exercise-hours-and-minutes" class="level1">
<h1>Exercise: Hours and Minutes</h1>
<p>Generate a list that contains all (hour, minute) pairs in a day.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_e55088ff0a79b1515a6321f5cd7cafb5.hs','e55088ff0a79b1515a6321f5cd7cafb5','e55088ff0a79b1515a6321f5cd7cafb5');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareae55088ff0a79b1515a6321f5cd7cafb5" value="" /><br /><div class="answer" id="rese55088ff0a79b1515a6321f5cd7cafb5"></div></form>
</section>
<section id="exercise-1121231234" class="level1">
<h1>Exercise: 1,1,2,1,2,3,1,2,3,4,…</h1>
<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=Comprehensions_en_5b4f21da6b1bae1cca71f640760599c5.hs','5b4f21da6b1bae1cca71f640760599c5','5b4f21da6b1bae1cca71f640760599c5');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea5b4f21da6b1bae1cca71f640760599c5" value="" /><br /><div class="answer" id="res5b4f21da6b1bae1cca71f640760599c5"></div></form>
</section>
<section id="exercise-010-101210-1-2-10123210-1" class="level1">
<h1>Exercise: 0,1,0,-1,0,1,2,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,…</h1>
<p>Generate the following 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=Comprehensions_en_b4f4e86796cafd06b609b5282aba3d72.hs','b4f4e86796cafd06b609b5282aba3d72','b4f4e86796cafd06b609b5282aba3d72');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareab4f4e86796cafd06b609b5282aba3d72" value="" /><br /><div class="answer" id="resb4f4e86796cafd06b609b5282aba3d72"></div></form>
<p>Hint: Use <code>concat</code>.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','029ab03e3ac3c798f95bbaeaad1bb7d1','029ab03e3ac3c798f95bbaeaad1bb7d1');"><div class="answer" id="res029ab03e3ac3c798f95bbaeaad1bb7d1"><code class="result">concat</code><code> :: </code><code class="type">Foldable t =&gt; t [a] -&gt; [a]</code></div></form>
</section>
<section id="exercise-month-and-days" class="level1">
<h1>Exercise: Month and Days</h1>
<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=Comprehensions_en_bdaeec908cc250f774869ec8253600f8.hs','bdaeec908cc250f774869ec8253600f8','bdaeec908cc250f774869ec8253600f8');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareabdaeec908cc250f774869ec8253600f8" value="" /><br /><div class="answer" id="resbdaeec908cc250f774869ec8253600f8"></div></form>
<p>Hint: It is easier with the <code>elem</code> function.</p>
</section>
<section id="exercise-table" class="level1">
<h1>Exercise: Table</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','f7cb42e30588aca842fd9587a857bf87','f7cb42e30588aca842fd9587a857bf87');"><div class="answer" id="resf7cb42e30588aca842fd9587a857bf87"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" width="320" height="200"><g style="stroke-width: 0.100; stroke: black; fill: white" transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"><rect height="1.000" transform="translate(-4.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-4.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-3.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-2.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(-1.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(0.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,-4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,-3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,-2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,-1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,0.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect></g></svg></div></form>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','072b030ba126b2f4b2374f342be9ed44','072b030ba126b2f4b2374f342be9ed44');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea072b030ba126b2f4b2374f342be9ed44" value="" /><br /><div class="answer" id="res072b030ba126b2f4b2374f342be9ed44"></div></form>
</section>
<section id="exercise-pattern-from-small-circles" class="level1">
<h1>Exercise: Pattern from Small Circles</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','7e2bc7c434414d5fce600d97f3abc3eb','7e2bc7c434414d5fce600d97f3abc3eb');"><div class="answer" id="res7e2bc7c434414d5fce600d97f3abc3eb"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" width="320" height="200"><g style="stroke-width: 0.100; stroke: black; fill: white" transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"><circle r="0.500" transform="translate(-4.000,-3.000)"></circle><circle r="0.500" transform="translate(-4.000,-2.000)"></circle><circle r="0.500" transform="translate(-4.000,-1.000)"></circle><circle r="0.500" transform="translate(-4.000,1.000)"></circle><circle r="0.500" transform="translate(-4.000,2.000)"></circle><circle r="0.500" transform="translate(-4.000,3.000)"></circle><circle r="0.500" transform="translate(-3.000,-4.000)"></circle><circle r="0.500" transform="translate(-3.000,-2.000)"></circle><circle r="0.500" transform="translate(-3.000,-1.000)"></circle><circle r="0.500" transform="translate(-3.000,1.000)"></circle><circle r="0.500" transform="translate(-3.000,2.000)"></circle><circle r="0.500" transform="translate(-3.000,4.000)"></circle><circle r="0.500" transform="translate(-2.000,-4.000)"></circle><circle r="0.500" transform="translate(-2.000,-3.000)"></circle><circle r="0.500" transform="translate(-2.000,-1.000)"></circle><circle r="0.500" transform="translate(-2.000,1.000)"></circle><circle r="0.500" transform="translate(-2.000,3.000)"></circle><circle r="0.500" transform="translate(-2.000,4.000)"></circle><circle r="0.500" transform="translate(-1.000,-4.000)"></circle><circle r="0.500" transform="translate(-1.000,-3.000)"></circle><circle r="0.500" transform="translate(-1.000,-2.000)"></circle><circle r="0.500" transform="translate(-1.000,2.000)"></circle><circle r="0.500" transform="translate(-1.000,3.000)"></circle><circle r="0.500" transform="translate(-1.000,4.000)"></circle><circle r="0.500" transform="translate(1.000,-4.000)"></circle><circle r="0.500" transform="translate(1.000,-3.000)"></circle><circle r="0.500" transform="translate(1.000,-2.000)"></circle><circle r="0.500" transform="translate(1.000,2.000)"></circle><circle r="0.500" transform="translate(1.000,3.000)"></circle><circle r="0.500" transform="translate(1.000,4.000)"></circle><circle r="0.500" transform="translate(2.000,-4.000)"></circle><circle r="0.500" transform="translate(2.000,-3.000)"></circle><circle r="0.500" transform="translate(2.000,-1.000)"></circle><circle r="0.500" transform="translate(2.000,1.000)"></circle><circle r="0.500" transform="translate(2.000,3.000)"></circle><circle r="0.500" transform="translate(2.000,4.000)"></circle><circle r="0.500" transform="translate(3.000,-4.000)"></circle><circle r="0.500" transform="translate(3.000,-2.000)"></circle><circle r="0.500" transform="translate(3.000,-1.000)"></circle><circle r="0.500" transform="translate(3.000,1.000)"></circle><circle r="0.500" transform="translate(3.000,2.000)"></circle><circle r="0.500" transform="translate(3.000,4.000)"></circle><circle r="0.500" transform="translate(4.000,-3.000)"></circle><circle r="0.500" transform="translate(4.000,-2.000)"></circle><circle r="0.500" transform="translate(4.000,-1.000)"></circle><circle r="0.500" transform="translate(4.000,1.000)"></circle><circle r="0.500" transform="translate(4.000,2.000)"></circle><circle r="0.500" transform="translate(4.000,3.000)"></circle></g></svg></div></form>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','03afdbd66e7929b125f8597834fa83a4','03afdbd66e7929b125f8597834fa83a4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea03afdbd66e7929b125f8597834fa83a4" value="" /><br /><div class="answer" id="res03afdbd66e7929b125f8597834fa83a4"></div></form>
</section>
<section id="exercise-chess-table" class="level1">
<h1>Exercise: Chess Table</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','3cc7315b36d6069eae6f0ef9b84d1d89','3cc7315b36d6069eae6f0ef9b84d1d89');"><div class="answer" id="res3cc7315b36d6069eae6f0ef9b84d1d89"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" width="320" height="200"><g style="stroke-width: 0.100; stroke: black; fill: white" transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"><rect height="8.000" width="8.000" x="-4.000" y="-4.000"></rect><g style="fill: gray" transform="translate(-4.500,-4.500)"><rect height="1.000" transform="translate(1.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,5.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(1.000,7.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,6.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(2.000,8.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,5.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(3.000,7.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,6.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(4.000,8.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(5.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(5.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(5.000,5.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(5.000,7.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(6.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(6.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(6.000,6.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(6.000,8.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(7.000,1.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(7.000,3.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(7.000,5.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(7.000,7.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(8.000,2.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(8.000,4.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(8.000,6.000)" width="1.000" x="-0.500" y="-0.500"></rect><rect height="1.000" transform="translate(8.000,8.000)" width="1.000" x="-0.500" y="-0.500"></rect></g></g></svg></div></form>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','3295c76acbf4caaed33c36b1b5fc2cb1','3295c76acbf4caaed33c36b1b5fc2cb1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3295c76acbf4caaed33c36b1b5fc2cb1" value="" /><br /><div class="answer" id="res3295c76acbf4caaed33c36b1b5fc2cb1"></div></form>
</section>
<section id="tuples" class="level1">
<h1>Tuples</h1>
<p><em>Tuples</em> may have multiple elements with different types. Remember that lists can contain only one type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','e895b192e42b298f0655009f9df29d7d','e895b192e42b298f0655009f9df29d7d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae895b192e42b298f0655009f9df29d7d" value=":t (True, 'a')" /><br /><div class="answer" id="rese895b192e42b298f0655009f9df29d7d"><code class="result">(True, 'a')</code><code> :: </code><code class="type">(Bool, Char)</code></div></form>
<p>In the above example (True, ‘a’) is the <em>value</em> of the tuple, and (Bool, Char) is the <em>type</em>.</p>
<p>Unlike a list, a tuple can only be compared to a tuple of the same length and type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','b86b8fa3c939c48757ed7db3aaeff137','b86b8fa3c939c48757ed7db3aaeff137');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab86b8fa3c939c48757ed7db3aaeff137" value="(False, 'c', &quot;Hello&quot;) == (True, '!', &quot;Goodbye&quot;)" /><br /><div class="answer" id="resb86b8fa3c939c48757ed7db3aaeff137"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="zipping" class="level1">
<h1>Zipping</h1>
<p>The function <code>zip</code> combines two lists. Each element from the first list is put in a tuple with the corresponding element from the second list.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','ebd2a5109bbdcea0ceec92cf89f1be2f','ebd2a5109bbdcea0ceec92cf89f1be2f');"><div class="answer" id="resebd2a5109bbdcea0ceec92cf89f1be2f"><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=Comprehensions_en.hs','6cb6d52256de42c622619692a20e31f3','6cb6d52256de42c622619692a20e31f3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6cb6d52256de42c622619692a20e31f3" value="zip &quot;abc&quot; [1,2]" /><br /><div class="answer" id="res6cb6d52256de42c622619692a20e31f3"><code class="result">[('a', 1), ('b', 2)]</code><code> :: </code><code class="type">[(Char, Integer)]</code></div></form>
<p>Zipping finishes if one of the lists ends.</p>
</section>
<section id="exercise-numbering" class="level1">
<h1>Exercise: Numbering</h1>
<p>Generate the list <code>[(1,'a'),(2,'b'),</code>…<code>(</code>…<code>,'z')]</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_690d1ae87c2b664e4254eba125d260cc.hs','690d1ae87c2b664e4254eba125d260cc','690d1ae87c2b664e4254eba125d260cc');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea690d1ae87c2b664e4254eba125d260cc" value="" /><br /><div class="answer" id="res690d1ae87c2b664e4254eba125d260cc"></div></form>
</section>
<section id="exercise-dominoes" class="level1">
<h1>Exercise: Dominoes</h1>
<p>Generate a list of all “dominoes”: <code>[(0,0),(0,1),...,(0,9),(1,1),...,(9,9)]</code>.</p>
<p>Domino <code>(1,0)</code> shall not be in the list because it is already in it as <code>(0,1)</code>.</p>
<p>Note: The dominoes in this exercise should contain at least zero, at most nine dots (i.e. they are numbered from <code>(0,0)</code> to <code>(9,9)</code>).</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_2149b5fd70257982af827620087c5310.hs','2149b5fd70257982af827620087c5310','2149b5fd70257982af827620087c5310');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea2149b5fd70257982af827620087c5310" value="" /><br /><div class="answer" id="res2149b5fd70257982af827620087c5310"></div></form>
</section>
<section id="exercise-precedence-of-and-and-or" class="level1">
<h1>Exercise: Precedence of AND and OR</h1>
<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=Comprehensions_en_608066689fc124c1db82da4fcb908185.hs','608066689fc124c1db82da4fcb908185','608066689fc124c1db82da4fcb908185');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea608066689fc124c1db82da4fcb908185" value="" /><br /><div class="answer" id="res608066689fc124c1db82da4fcb908185"></div></form>
<p>The type of the result should be <code>[(Bool,Bool,Bool)]</code></p>
</section>
<section id="exercises-with-infinite-lists" class="level1">
<h1>Exercises with Infinite Lists</h1>
<p>You can use the <code>take</code> function to observe the beginning of infinite lists.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','db85e5187d04fd19a34bf5f3c69f6f22','db85e5187d04fd19a34bf5f3c69f6f22');"><div class="answer" id="resdb85e5187d04fd19a34bf5f3c69f6f22"><code class="result">take</code><code> :: </code><code class="type">Int -&gt; [a] -&gt; [a]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','958b24451fd8f754c18b18d0b7ee3f4a','958b24451fd8f754c18b18d0b7ee3f4a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea958b24451fd8f754c18b18d0b7ee3f4a" value="take 6 [1,3..]" /><br /><div class="answer" id="res958b24451fd8f754c18b18d0b7ee3f4a"><code class="result">[1, 3, 5, 7, 9, 11]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<p>What is the difference between <code>take</code> and <code>!!</code>?</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','25f05dbcf3dbeb6f4f5a3439173f117c','25f05dbcf3dbeb6f4f5a3439173f117c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea25f05dbcf3dbeb6f4f5a3439173f117c" value="['a','b','c'] !! 0" /><br /><div class="answer" id="res25f05dbcf3dbeb6f4f5a3439173f117c"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','71431e7af23b826ba06b64c751e87eb9','71431e7af23b826ba06b64c751e87eb9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea71431e7af23b826ba06b64c751e87eb9" value="take 1 ['a','b','c']" /><br /><div class="answer" id="res71431e7af23b826ba06b64c751e87eb9"></div></form>
<p>Explain this result:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','72d7ce1716d2cf70cc01e78547a6b642','72d7ce1716d2cf70cc01e78547a6b642');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea72d7ce1716d2cf70cc01e78547a6b642" value="take 10 [[1..]]" /><br /><div class="answer" id="res72d7ce1716d2cf70cc01e78547a6b642"></div></form>
</section>
<section id="exercise-all-pairs-of-natural-numbers" class="level1">
<h1>Exercise: All Pairs of Natural Numbers</h1>
<p>Generate the list <code>[(0,10),(1,9),</code>…<code>,(10,0)]</code>.</p>
<p>Enumerate all pairs of natural numbers, e.g. <code>[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),</code> …<code>]</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_8af9381306582f6937129a250df14676.hs','8af9381306582f6937129a250df14676','8af9381306582f6937129a250df14676');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea8af9381306582f6937129a250df14676" value="" /><br /><div class="answer" id="res8af9381306582f6937129a250df14676"></div></form>
</section>
<section id="exercise-1-2-2-3-3-3" class="level1">
<h1>Exercise: 1, 2, 2, 3, 3, 3, …</h1>
<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=Comprehensions_en_0dede2b174eb91dab6c8f61baf8e5b3b.hs','0dede2b174eb91dab6c8f61baf8e5b3b','0dede2b174eb91dab6c8f61baf8e5b3b');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea0dede2b174eb91dab6c8f61baf8e5b3b" value="" /><br /><div class="answer" id="res0dede2b174eb91dab6c8f61baf8e5b3b"></div></form>
</section>
<section id="exercise-1-2-1-2-3-2-1" class="level1">
<h1>Exercise: 1, 2, 1, 2, 3, 2, 1, …</h1>
<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=Comprehensions_en.hs','d01b3dc19e87cdb6fc3eefd8514589a5','d01b3dc19e87cdb6fc3eefd8514589a5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread01b3dc19e87cdb6fc3eefd8514589a5" value=":t concat" /><br /><div class="answer" id="resd01b3dc19e87cdb6fc3eefd8514589a5"><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=Comprehensions_en_1416a2bfd4855ee1b386d2af2dbe29b4.hs','1416a2bfd4855ee1b386d2af2dbe29b4','1416a2bfd4855ee1b386d2af2dbe29b4');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea1416a2bfd4855ee1b386d2af2dbe29b4" value="" /><br /><div class="answer" id="res1416a2bfd4855ee1b386d2af2dbe29b4"></div></form>
</section>
<section id="exercise-stars" class="level1">
<h1>Exercise: Stars</h1>
<p>Test the <code>unwords</code> function.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en.hs','e58c72324f599aa3fd4803c937f80aed','e58c72324f599aa3fd4803c937f80aed');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae58c72324f599aa3fd4803c937f80aed" value=":t unwords" /><br /><div class="answer" id="rese58c72324f599aa3fd4803c937f80aed"><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=Comprehensions_en_a39a53f2532b83979e93ec53236aacca.hs','a39a53f2532b83979e93ec53236aacca','a39a53f2532b83979e93ec53236aacca');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareaa39a53f2532b83979e93ec53236aacca" value="" /><br /><div class="answer" id="resa39a53f2532b83979e93ec53236aacca"></div></form>
</section>
<section id="exercise-omitting-square-numbers" class="level1">
<h1>Exercise: Omitting Square Numbers</h1>
<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=Comprehensions_en_453b98e8ca4c22659706bed64b32470e.hs','453b98e8ca4c22659706bed64b32470e','453b98e8ca4c22659706bed64b32470e');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea453b98e8ca4c22659706bed64b32470e" value="" /><br /><div class="answer" id="res453b98e8ca4c22659706bed64b32470e"></div></form>
</section>
<section id="exercise-finding-an-arithmetic-sequence" class="level1">
<h1>Exercise: Finding an Arithmetic Sequence</h1>
<p>Consider the following equations: 3+4+5+6=18; 15+16+…+34+35=525. They consist of sequences of ascending numbers whose sum equals the product of the elements on the left and right sides.</p>
<p>Generate all such sequences ordered by the last element.</p>
<p>For testing, only the first 6 sequences must be generated.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Comprehensions_en_2e6d3f16d1213776b0698e9376976d5d.hs','2e6d3f16d1213776b0698e9376976d5d','2e6d3f16d1213776b0698e9376976d5d');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea2e6d3f16d1213776b0698e9376976d5d" value="" /><br /><div class="answer" id="res2e6d3f16d1213776b0698e9376976d5d"></div></form>
<p>Hint: Use the <code>init</code> and <code>tails</code> functions from the <code>List</code> module.</p>
</section>
</body>
</html>

