<?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>Lists</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">Lists</h1>
<div id="info"></div>
<ul>
<li><a href="#specific-lists">Specific Lists</a></li>
<li><a href="#strings">Strings</a></li>
<li><a href="#dotdot-expressions">Dotdot Expressions</a></li>
<li><a href="#four-basic-operations-on-lists">Four Basic Operations on Lists</a></li>
<li><a href="#exercise-10-9-8--9--10">Exercise: 10, 9, 8, …, -9, -10</a></li>
<li><a href="#exercise-the-nth-element-of-an-arithmetic-sequence">Exercise: The <em>n</em>th element of an Arithmetic Sequence</a></li>
<li><a href="#exercises">Exercises</a></li>
<li><a href="#sum-and-product">Sum and Product</a></li>
<li><a href="#exercise-number-of-different-orderings-of-10-elements">Exercise: Number of Different Orderings of 10 Elements</a></li>
<li><a href="#exercise-number-of-combinations">Exercise: Number of Combinations</a></li>
<li><a href="#exercises-1">Exercises</a></li>
</ul>
</div>
<section id="specific-lists" class="level1">
<h1>Specific Lists</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','6522324b8495e3bca2cd0861a51ea4b9','6522324b8495e3bca2cd0861a51ea4b9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6522324b8495e3bca2cd0861a51ea4b9" value="[True, False, False] :: [Bool]" /><br /><div class="answer" id="res6522324b8495e3bca2cd0861a51ea4b9"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','a28d1dca6e7b53f87f8328a14b7e464c','a28d1dca6e7b53f87f8328a14b7e464c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa28d1dca6e7b53f87f8328a14b7e464c" value="[1, 2, 3]            :: Num a =&gt; [a]" /><br /><div class="answer" id="resa28d1dca6e7b53f87f8328a14b7e464c"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','39eeb56078eb4d0b70a55310edb38053','39eeb56078eb4d0b70a55310edb38053');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea39eeb56078eb4d0b70a55310edb38053" value="[]                   :: [a]" /><br /><div class="answer" id="res39eeb56078eb4d0b70a55310edb38053"></div></form>
<p>Ordering and multiplicity matter:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','3fbac0a732a90ba3e43b7d8ee54f3ec3','3fbac0a732a90ba3e43b7d8ee54f3ec3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3fbac0a732a90ba3e43b7d8ee54f3ec3" value="[1, 2, 3] /= [3, 2, 1]" /><br /><div class="answer" id="res3fbac0a732a90ba3e43b7d8ee54f3ec3"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','f40a0a438b31362603c004224654d4fc','f40a0a438b31362603c004224654d4fc');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf40a0a438b31362603c004224654d4fc" value="[1, 1] /= [1]" /><br /><div class="answer" id="resf40a0a438b31362603c004224654d4fc"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<p>Lists are homogeneous, that is, all elements should be of the same type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','e33fabebbfebd48735a7da150ebfe37b','e33fabebbfebd48735a7da150ebfe37b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae33fabebbfebd48735a7da150ebfe37b" value="[1, True]" /><br /><div class="answer" id="rese33fabebbfebd48735a7da150ebfe37b"><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>
<div class="handout">
<hr />
<p>The homogeneity of lists is due to strict typing. (However, inhomogeneous lists may be replaced by homogeneous lists.)</p>
<p>The <code>[13]</code> and <code>13</code> are completely different values, they are not even comparable.</p>
</div>
</section>
<section id="strings" class="level1">
<h1>Strings</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','bf30a09a2fd224c3f921681584f9197b','bf30a09a2fd224c3f921681584f9197b');"><div class="answer" id="resbf30a09a2fd224c3f921681584f9197b"><code class="result">'a'</code><code> :: </code><code class="type">Char</code></div></form>
<p>Character literals: <code>'a', 'ű', '\369', '\\', '\n' :: Char</code></p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','51b07505704fefa8ed1adc784762539c','51b07505704fefa8ed1adc784762539c');"><div class="answer" id="res51b07505704fefa8ed1adc784762539c"><code class="result">&quot;apple&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p>String literals: <code>&quot;apple&quot;, &quot;\n\n&quot;, &quot;&quot; :: String</code></p>
<p>Strings are nothing more than just list of characters:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','e6c5c38a8b87150ea28fdfedd2c637a5','e6c5c38a8b87150ea28fdfedd2c637a5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae6c5c38a8b87150ea28fdfedd2c637a5" value="['a', 'b', 'c']" /><br /><div class="answer" id="rese6c5c38a8b87150ea28fdfedd2c637a5"><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=Lists_en.hs','f5361a340f7994dbfc277f30d5761c30','f5361a340f7994dbfc277f30d5761c30');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf5361a340f7994dbfc277f30d5761c30" value="[1..10]" /><br /><div class="answer" id="resf5361a340f7994dbfc277f30d5761c30"><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=Lists_en.hs','027c9a6b3dd361992c756dd638049bc4','027c9a6b3dd361992c756dd638049bc4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea027c9a6b3dd361992c756dd638049bc4" value="[1,3..10]" /><br /><div class="answer" id="res027c9a6b3dd361992c756dd638049bc4"><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=Lists_en.hs','53e715f1a45e2d61fd496f4a4986b390','53e715f1a45e2d61fd496f4a4986b390');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea53e715f1a45e2d61fd496f4a4986b390" value="[1..]" /><br /><div class="answer" id="res53e715f1a45e2d61fd496f4a4986b390"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','b81a116a0bf9f1c50f195d849a961181','b81a116a0bf9f1c50f195d849a961181');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab81a116a0bf9f1c50f195d849a961181" value="[1,3..]" /><br /><div class="answer" id="resb81a116a0bf9f1c50f195d849a961181"></div></form>
<p>And that is also possible:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','a59e22038b4b0c00254453c7f954f03d','a59e22038b4b0c00254453c7f954f03d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa59e22038b4b0c00254453c7f954f03d" value="['a'..'z']" /><br /><div class="answer" id="resa59e22038b4b0c00254453c7f954f03d"><code class="result">&quot;abcdefghijklmnopqrstuvwxyz&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
<section id="four-basic-operations-on-lists" class="level1">
<h1>Four Basic Operations on Lists</h1>
<p>The <code>length</code> function tells the number of items in the list.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','fa456a5fcb2a96a0bf313e150a747d25','fa456a5fcb2a96a0bf313e150a747d25');"><div class="answer" id="resfa456a5fcb2a96a0bf313e150a747d25"><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=Lists_en.hs','ae21eac93da2dcddaad81b898a7d0c5c','ae21eac93da2dcddaad81b898a7d0c5c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaae21eac93da2dcddaad81b898a7d0c5c" value="length [4,7,8]" /><br /><div class="answer" id="resae21eac93da2dcddaad81b898a7d0c5c"><code class="result">3</code><code> :: </code><code class="type">Int</code></div></form>
<p>The index function (<code>!!</code>) gets an item at an index.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','5d48834cb1530f398b0dd38db3757484','5d48834cb1530f398b0dd38db3757484');"><div class="answer" id="res5d48834cb1530f398b0dd38db3757484"><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=Lists_en.hs','836c4aba29b6f80cceaa758ae56031bd','836c4aba29b6f80cceaa758ae56031bd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea836c4aba29b6f80cceaa758ae56031bd" value="['a','b','c'] !! 1" /><br /><div class="answer" id="res836c4aba29b6f80cceaa758ae56031bd"><code class="result">'b'</code><code> :: </code><code class="type">Char</code></div></form>
<p>The concatenate function (<code>++</code>) combines two lists. They must be of the same type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','f6b38789dc766bde14b5f3f63ddbe80c','f6b38789dc766bde14b5f3f63ddbe80c');"><div class="answer" id="resf6b38789dc766bde14b5f3f63ddbe80c"><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=Lists_en.hs','3383e8f00a6e538b19d61f6f36d6de7f','3383e8f00a6e538b19d61f6f36d6de7f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3383e8f00a6e538b19d61f6f36d6de7f" value="&quot;he&quot; ++ &quot;llo&quot;" /><br /><div class="answer" id="res3383e8f00a6e538b19d61f6f36d6de7f"><code class="result">&quot;hello&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<p>The cons function (<code>:</code>) adds one item to the head of the list. It must be of the same type.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','8e21e84f33f3629219d764acb089c323','8e21e84f33f3629219d764acb089c323');"><div class="answer" id="res8e21e84f33f3629219d764acb089c323"><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=Lists_en.hs','a4729ffa7ccce008caf854ecb8f9b42a','a4729ffa7ccce008caf854ecb8f9b42a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa4729ffa7ccce008caf854ecb8f9b42a" value="5 : [10,20,3]" /><br /><div class="answer" id="resa4729ffa7ccce008caf854ecb8f9b42a"><code class="result">[5, 10, 20, 3]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<div class="handout">
<hr />
<p>Note: With <code>(!!)</code>, list items are numbered from zero.</p>
</div>
</section>
<section id="exercise-10-9-8--9--10" class="level1">
<h1>Exercise: 10, 9, 8, …, -9, -10</h1>
<p>List the numbers from <code>10</code> to <code>-10</code>.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Lists_en_f09c9af7533a5b3458ac44f5804413f1.hs','f09c9af7533a5b3458ac44f5804413f1','f09c9af7533a5b3458ac44f5804413f1');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tareaf09c9af7533a5b3458ac44f5804413f1" value="" /><br /><div class="answer" id="resf09c9af7533a5b3458ac44f5804413f1"></div></form>
</section>
<section id="exercise-the-nth-element-of-an-arithmetic-sequence" class="level1">
<h1>Exercise: The <em>n</em>th element of an Arithmetic Sequence</h1>
<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=Lists_en_99fd1c04d3c90b7f05cf7971c9721e78.hs','99fd1c04d3c90b7f05cf7971c9721e78','99fd1c04d3c90b7f05cf7971c9721e78');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea99fd1c04d3c90b7f05cf7971c9721e78" value="" /><br /><div class="answer" id="res99fd1c04d3c90b7f05cf7971c9721e78"></div></form>
</section>
<section id="exercises" class="level1">
<h1>Exercises</h1>
<p>Guess the type of the following expressions:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','64c7e0460826d9c7e2a59dd1cee976dd','64c7e0460826d9c7e2a59dd1cee976dd');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea64c7e0460826d9c7e2a59dd1cee976dd" value=":t [[]]" /><br /><div class="answer" id="res64c7e0460826d9c7e2a59dd1cee976dd"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','e67983bb9aecc917d321123d1c0133eb','e67983bb9aecc917d321123d1c0133eb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae67983bb9aecc917d321123d1c0133eb" value=":t [True, False, [False], True]" /><br /><div class="answer" id="rese67983bb9aecc917d321123d1c0133eb"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','7efaf7be0e7ae8aae8127fb1d98437d7','7efaf7be0e7ae8aae8127fb1d98437d7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7efaf7be0e7ae8aae8127fb1d98437d7" value=":t &quot;appl&quot; ++ ['e']" /><br /><div class="answer" id="res7efaf7be0e7ae8aae8127fb1d98437d7"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','87db64bc6025520962d2e314d1c2b1b3','87db64bc6025520962d2e314d1c2b1b3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea87db64bc6025520962d2e314d1c2b1b3" value=":t length [] ++ [1]" /><br /><div class="answer" id="res87db64bc6025520962d2e314d1c2b1b3"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','c6cad25bb199d895866780e2d4b32fbe','c6cad25bb199d895866780e2d4b32fbe');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac6cad25bb199d895866780e2d4b32fbe" value=":t [[1,2],[3,4]] ++ [] ++ [[]] ++ [[[]]]" /><br /><div class="answer" id="resc6cad25bb199d895866780e2d4b32fbe"></div></form>
</section>
<section id="sum-and-product" class="level1">
<h1>Sum and Product</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','1a6560cf059777826c6c4e66f280f786','1a6560cf059777826c6c4e66f280f786');"><div class="answer" id="res1a6560cf059777826c6c4e66f280f786"><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=Lists_en.hs','1bdde484139ea5678e03058b62527d98','1bdde484139ea5678e03058b62527d98');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1bdde484139ea5678e03058b62527d98" value="sum [1..10]" /><br /><div class="answer" id="res1bdde484139ea5678e03058b62527d98"></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','1ee8dcf1e2b5a0e8a1f326e4cd937898','1ee8dcf1e2b5a0e8a1f326e4cd937898');"><div class="answer" id="res1ee8dcf1e2b5a0e8a1f326e4cd937898"><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=Lists_en.hs','206e1f88423ececab444f6c3e19993cb','206e1f88423ececab444f6c3e19993cb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea206e1f88423ececab444f6c3e19993cb" value="product [1..10]" /><br /><div class="answer" id="res206e1f88423ececab444f6c3e19993cb"></div></form>
</section>
<section id="exercise-number-of-different-orderings-of-10-elements" class="level1">
<h1>Exercise: Number of Different Orderings of 10 Elements</h1>
<p>How many ways can 10 different elements be sorted?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Lists_en_828bbc61d644b28fe6b6798cef4e3834.hs','828bbc61d644b28fe6b6798cef4e3834','828bbc61d644b28fe6b6798cef4e3834');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea828bbc61d644b28fe6b6798cef4e3834" value="" /><br /><div class="answer" id="res828bbc61d644b28fe6b6798cef4e3834"></div></form>
</section>
<section id="exercise-number-of-combinations" class="level1">
<h1>Exercise: Number of Combinations</h1>
<p>How many ways can 30 elements be chosen from 70 different elements?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Lists_en_608a2a9b8253bc13d0909e2d2bc48683.hs','608a2a9b8253bc13d0909e2d2bc48683','608a2a9b8253bc13d0909e2d2bc48683');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea608a2a9b8253bc13d0909e2d2bc48683" value="" /><br /><div class="answer" id="res608a2a9b8253bc13d0909e2d2bc48683"></div></form>
<p>Hint: Use the <code>div</code> function instead of <code>(/)</code>.</p>
</section>
<section id="exercises-1" class="level1">
<h1>Exercises</h1>
<p>What is more: the number of atoms in the universe, or number of orderings of 100 different elements?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','d09bf41544a3365a46c9077ebb5e35c3','d09bf41544a3365a46c9077ebb5e35c3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread09bf41544a3365a46c9077ebb5e35c3" value="" /><br /><div class="answer" id="resd09bf41544a3365a46c9077ebb5e35c3"></div></form>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','fbd7939d674997cdb4692d34de8633c4','fbd7939d674997cdb4692d34de8633c4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafbd7939d674997cdb4692d34de8633c4" value="" /><br /><div class="answer" id="resfbd7939d674997cdb4692d34de8633c4"></div></form>
<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=Lists_en.hs','35f4a8d465e6e1edc05f3d8ab658c551','35f4a8d465e6e1edc05f3d8ab658c551');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea35f4a8d465e6e1edc05f3d8ab658c551" value="" /><br /><div class="answer" id="res35f4a8d465e6e1edc05f3d8ab658c551"></div></form>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Lists_en.hs','d1fe173d08e959397adf34b1d77e88d7','d1fe173d08e959397adf34b1d77e88d7');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread1fe173d08e959397adf34b1d77e88d7" value="" /><br /><div class="answer" id="resd1fe173d08e959397adf34b1d77e88d7"></div></form>
</section>
</body>
</html>

