<?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>Defining Functions</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">Defining Functions</h1>
<div id="info"></div>
<ul>
<li><a href="#programs-in-haskell">Programs in Haskell</a></li>
<li><a href="#modules">Modules</a></li>
<li><a href="#comments">Comments</a></li>
<li><a href="#function-definitions">Function Definitions</a></li>
<li><a href="#exercise-mountain">Exercise: Mountain [*]</a></li>
<li><a href="#exercise-are-triangle-sides">Exercise: Are Triangle Sides</a></li>
<li><a href="#exercise-prelude.even">Exercise: <code>Prelude.even</code> [*]</a></li>
<li><a href="#exercise-prelude.odd">Exercise: <code>Prelude.odd</code></a></li>
<li><a href="#exercise-divisibility">Exercise: Divisibility [*]</a></li>
<li><a href="#exercise-leap-years">Exercise: Leap Years</a></li>
<li><a href="#exercise-sum-of-squares">Exercise: Sum of Squares</a></li>
<li><a href="#exercise-divisors">Exercise: Divisors [*]</a></li>
<li><a href="#exercise-proper-divisors">Exercise: Proper Divisors</a></li>
<li><a href="#exercise-regular-polygons">Exercise: Regular Polygons</a></li>
<li><a href="#exercise-stars">Exercise: Stars</a></li>
<li><a href="#defining-operators">Defining Operators</a></li>
</ul>
</div>
<section id="programs-in-haskell" class="level1">
<h1>Programs in Haskell</h1>
<p>A Haskell program is a set of declarations. Declarations:</p>
<ul>
<li>Type declarations: <code>f :: Int -&gt; Int</code></li>
<li>Function definitions: <code>f x = x</code></li>
<li>Constant definitions: <code>pi = 2 * acos 0</code></li>
<li>Operator definitions: <code>a &lt;= b = not (a &gt; b)</code></li>
</ul>
<p>Further declarations:</p>
<ul>
<li>Type definitions: <code>type String = [Char]</code></li>
<li>Type class definitions: <code>class Num a where</code> …</li>
<li>Type class instance definitions: <code>instance Num Int where</code> …</li>
</ul>
<p>The order of declarations is not important.</p>
</section>
<section id="modules" class="level1">
<h1>Modules</h1>
<p>The definitions are organized into modules, a module is a unit of compilation.</p>
<p>Structure of a Haskell module:</p>
<ul>
<li>Header (it is not required for top-level modules): <code>module</code> name <code>where</code></li>
<li><code>import</code> declarations</li>
<li>other declarations</li>
</ul>
<p>Every Haskell module is a plain text file with an <code>.hs</code> or <code>.lhs</code> extension.</p>
<div class="handout">
<hr />
<p>Let us create an empty text file with the name <code>X.hs</code>.</p>
<p>Load this module to the interpreter.</p>
<pre><code>:l X.hs</code></pre>
<p>Reload the currently loaded module.</p>
<pre><code>:r</code></pre>
<hr />
<p>Definitions have to be added to one or more text files, all of them are called <em>modules</em>. Names for modules consist of letters and numerals, and they should start with capital letters, e.g. <code>Char</code>, <code>List</code>, <code>Ratio</code>.</p>
<p>When clicking on files with <code>.hs</code> extension on Windows systems, the GHCi is launched automatically and it loads the module with the corresponding name.</p>
<p>After the module is loaded, the prompt in GHCi changes to <code>Main*&gt;</code>. Here, the <code>*</code> symbol signals that all of definitions from the module are now visible, together with the contents of modules that were imported from it. (That is, together with <code>Prelude</code>, which is always automatically available.)</p>
</div>
</section>
<section id="comments" class="level1">
<h1>Comments</h1>
<p>This is a line comment.</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb3-1" data-line-number="1"> <span class="co">-- Comment til the end of the line</span></a></code></pre></div>
<p>And this is a multi-line comment.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="co">{- comment -}</span></a></code></pre></div>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="co">{- comments</span></a>
<a class="sourceLine" id="cb5-2" data-line-number="2"><span class="co"> {- embedded into -}</span></a>
<a class="sourceLine" id="cb5-3" data-line-number="3"><span class="co">  each other -}</span></a></code></pre></div>
<div class="handout">
<hr />
<p>Line comments start with the <code>--</code> symbol and they end at the end of the line.</p>
<p>Multi-line comments are delimited by <code>{-</code> and <code>-}</code> symbols. Multi-line comments may be embedded into each other.</p>
</div>
</section>
<section id="function-definitions" class="level1">
<h1>Function Definitions</h1>
<p>A one-parameter function, without a type:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" data-line-number="1">f x <span class="fu">=</span> x <span class="fu">+</span> <span class="dv">1</span></a></code></pre></div>
<p>Ask the compiler what type was inferred for this function.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','5a550773c5811b7b1d5858ddef56f302','5a550773c5811b7b1d5858ddef56f302');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5a550773c5811b7b1d5858ddef56f302" value=":t f" /><br /><div class="answer" id="res5a550773c5811b7b1d5858ddef56f302"></div></form>
<p>A two-parameter function, with a type:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="ot">g ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span></a>
<a class="sourceLine" id="cb7-2" data-line-number="2">g a b <span class="fu">=</span> a <span class="fu">*</span> b <span class="fu">+</span> <span class="dv">1</span></a></code></pre></div>
<p>Usage:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','aae8b8a9146ea26f524fdaa18e2b4f49','aae8b8a9146ea26f524fdaa18e2b4f49');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaae8b8a9146ea26f524fdaa18e2b4f49" value="g 1 2" /><br /><div class="answer" id="resaae8b8a9146ea26f524fdaa18e2b4f49"><code class="result">3</code><code> :: </code><code class="type">Integer</code></div></form>
<div class="handout">
<hr />
<p>Function and variable names consist of letters and numerals, but they have to start with a lowercase letter. They may contain the “underscore” (<code>_</code>) and “prime” (<code>'</code>) characters, e.g. <code>f_1</code>, <code>f'</code>, and <code>f''</code>.</p>
</div>
</section>
<section id="exercise-mountain" class="level1">
<h1>Exercise: Mountain [*]</h1>
<p>Generate the following list: [1, 2, …, n-1, n, n-1, …, 2, 1]</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="ot">mountain ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_fe79eef4cd115bf759fe02e24bd523ee.hs','fe79eef4cd115bf759fe02e24bd523ee','fe79eef4cd115bf759fe02e24bd523ee');"><textarea cols="80" rows="3" id="tareafe79eef4cd115bf759fe02e24bd523ee"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resfe79eef4cd115bf759fe02e24bd523ee"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','0792e6607fdba8ecaf60a1b2faf68ced','0792e6607fdba8ecaf60a1b2faf68ced');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0792e6607fdba8ecaf60a1b2faf68ced" value="mountain 3" /><br /><div class="answer" id="res0792e6607fdba8ecaf60a1b2faf68ced"><code class="result">[1, 2, 3, 2, 1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','7f33b2f07d5499af5011c6401f263829','7f33b2f07d5499af5011c6401f263829');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7f33b2f07d5499af5011c6401f263829" value="mountain 1" /><br /><div class="answer" id="res7f33b2f07d5499af5011c6401f263829"><code class="result">[1]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','0e37df6fc5e5c7f87ab991dac8ce57da','0e37df6fc5e5c7f87ab991dac8ce57da');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0e37df6fc5e5c7f87ab991dac8ce57da" value="mountain 0" /><br /><div class="answer" id="res0e37df6fc5e5c7f87ab991dac8ce57da"><code class="result">[]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','ec1843bad99dc53a2469a4810126e444','ec1843bad99dc53a2469a4810126e444');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaec1843bad99dc53a2469a4810126e444" value="mountain (-1)" /><br /><div class="answer" id="resec1843bad99dc53a2469a4810126e444"><code class="result">[]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-are-triangle-sides" class="level1">
<h1>Exercise: Are Triangle Sides</h1>
<p>Given sides of a triangle as <code>a</code>, <code>b</code>, <code>c</code>, decide whether the given triangle can be constructed.</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="ot">areTriangleSides ::</span> <span class="dt">Real</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_1149c6b9a4f562c4c830dadfae2ebc08.hs','1149c6b9a4f562c4c830dadfae2ebc08','1149c6b9a4f562c4c830dadfae2ebc08');"><textarea cols="80" rows="3" id="tarea1149c6b9a4f562c4c830dadfae2ebc08"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1149c6b9a4f562c4c830dadfae2ebc08"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','c47652d69cb6cb909357d8168ed23e7a','c47652d69cb6cb909357d8168ed23e7a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac47652d69cb6cb909357d8168ed23e7a" value="areTriangleSides 3 4 5" /><br /><div class="answer" id="resc47652d69cb6cb909357d8168ed23e7a"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','3a8705f60b06f56b8a2ed82b456c814e','3a8705f60b06f56b8a2ed82b456c814e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3a8705f60b06f56b8a2ed82b456c814e" value="areTriangleSides 3 1 5" /><br /><div class="answer" id="res3a8705f60b06f56b8a2ed82b456c814e"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-prelude.even" class="level1">
<h1>Exercise: <code>Prelude.even</code> [*]</h1>
<p>Redefine the <code>even</code> function from the <code>Prelude</code> module, which determines a given integer is even.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb10-1" data-line-number="1">even<span class="ot"> ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_b85d295ddf9795b0c7487c22f9e9d73f.hs','b85d295ddf9795b0c7487c22f9e9d73f','b85d295ddf9795b0c7487c22f9e9d73f');"><textarea cols="80" rows="3" id="tareab85d295ddf9795b0c7487c22f9e9d73f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resb85d295ddf9795b0c7487c22f9e9d73f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','236e2a9172f6b68cd47c1c9123ee9ea5','236e2a9172f6b68cd47c1c9123ee9ea5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea236e2a9172f6b68cd47c1c9123ee9ea5" value="even 15" /><br /><div class="answer" id="res236e2a9172f6b68cd47c1c9123ee9ea5"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','0b008ad4d935d01d482eae8fd21ffe08','0b008ad4d935d01d482eae8fd21ffe08');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0b008ad4d935d01d482eae8fd21ffe08" value="even 16" /><br /><div class="answer" id="res0b008ad4d935d01d482eae8fd21ffe08"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<div class="handout">
<hr />
<p>Because <code>even</code> is already defined in <code>Prelude</code>, we can only redefine this function if we hide its definition from <code>Prelude</code>.</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="co">-- import Prelude hiding (even)</span></a></code></pre></div>
<p><code>import</code> declarations can be only added to the beginning of the module.</p>
<p>More definitions can be also hidden by using <code>hiding</code>.</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="co">-- import Prelude hiding (even, odd)</span></a></code></pre></div>
</div>
</section>
<section id="exercise-prelude.odd" class="level1">
<h1>Exercise: <code>Prelude.odd</code></h1>
<p>Redefine the <code>odd</code> function from the <code>Prelude</code> module, which determines a given integer is odd.</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb13-1" data-line-number="1">odd<span class="ot"> ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_1bc52c803d6691a7c8c0d2f1aed65bf2.hs','1bc52c803d6691a7c8c0d2f1aed65bf2','1bc52c803d6691a7c8c0d2f1aed65bf2');"><textarea cols="80" rows="3" id="tarea1bc52c803d6691a7c8c0d2f1aed65bf2"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1bc52c803d6691a7c8c0d2f1aed65bf2"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','f17dc51733eb034e26346f4cec8f8ba4','f17dc51733eb034e26346f4cec8f8ba4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf17dc51733eb034e26346f4cec8f8ba4" value="odd 15" /><br /><div class="answer" id="resf17dc51733eb034e26346f4cec8f8ba4"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','0fa0e1d37ee4a873a859f553db3b542e','0fa0e1d37ee4a873a859f553db3b542e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0fa0e1d37ee4a873a859f553db3b542e" value="[odd x | x&lt;-[1..5]]" /><br /><div class="answer" id="res0fa0e1d37ee4a873a859f553db3b542e"><code class="result">[True, False, True, False, True]</code><code> :: </code><code class="type">[Bool]</code></div></form>
</section>
<section id="exercise-divisibility" class="level1">
<h1>Exercise: Divisibility [*]</h1>
<p>Define the divisibility.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="ot">divides ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_500e5957efa8b5ea974941e04c031312.hs','500e5957efa8b5ea974941e04c031312','500e5957efa8b5ea974941e04c031312');"><textarea cols="80" rows="3" id="tarea500e5957efa8b5ea974941e04c031312"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res500e5957efa8b5ea974941e04c031312"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','009801cfb7fa2fdc49ccde01730e8b67','009801cfb7fa2fdc49ccde01730e8b67');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea009801cfb7fa2fdc49ccde01730e8b67" value="3 `divides` 12" /><br /><div class="answer" id="res009801cfb7fa2fdc49ccde01730e8b67"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','09b61ffed6ec98b7251176de4fb6f155','09b61ffed6ec98b7251176de4fb6f155');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea09b61ffed6ec98b7251176de4fb6f155" value="3 `divides` 13" /><br /><div class="answer" id="res09b61ffed6ec98b7251176de4fb6f155"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-leap-years" class="level1">
<h1>Exercise: Leap Years</h1>
<p>Determine a given year is a leap year.</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="ot">isLeapYear ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_f05df6ac0c9e21ae5669623f0f43a0e4.hs','f05df6ac0c9e21ae5669623f0f43a0e4','f05df6ac0c9e21ae5669623f0f43a0e4');"><textarea cols="80" rows="5" id="tareaf05df6ac0c9e21ae5669623f0f43a0e4"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf05df6ac0c9e21ae5669623f0f43a0e4"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','2503e190a51f0e3a3a3b95873296797e','2503e190a51f0e3a3a3b95873296797e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2503e190a51f0e3a3a3b95873296797e" value="[y | y&lt;-[1950..1960], isLeapYear y]" /><br /><div class="answer" id="res2503e190a51f0e3a3a3b95873296797e"><code class="result">[1952, 1956, 1960]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','9cc6e2706fcf89da69f704a61ca30417','9cc6e2706fcf89da69f704a61ca30417');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9cc6e2706fcf89da69f704a61ca30417" value="isLeapYear 1900" /><br /><div class="answer" id="res9cc6e2706fcf89da69f704a61ca30417"><code class="result">False</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','d8d98c044a0b9f5b43e1afe2acebf96b','d8d98c044a0b9f5b43e1afe2acebf96b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread8d98c044a0b9f5b43e1afe2acebf96b" value="isLeapYear 2000" /><br /><div class="answer" id="resd8d98c044a0b9f5b43e1afe2acebf96b"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-sum-of-squares" class="level1">
<h1>Exercise: Sum of Squares</h1>
<p>Calculate the sum of squares from <code>1</code> to <code>n</code>.</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="ot">sumSquaresTo ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_6662a0eec0490e8221e1a773dbe4bc52.hs','6662a0eec0490e8221e1a773dbe4bc52','6662a0eec0490e8221e1a773dbe4bc52');"><textarea cols="80" rows="5" id="tarea6662a0eec0490e8221e1a773dbe4bc52"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res6662a0eec0490e8221e1a773dbe4bc52"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','8ec3117f1c8d02c4307ae1ffa8465c02','8ec3117f1c8d02c4307ae1ffa8465c02');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8ec3117f1c8d02c4307ae1ffa8465c02" value="sumSquaresTo 0     " /><br /><div class="answer" id="res8ec3117f1c8d02c4307ae1ffa8465c02"><code class="result">0</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','a3b09446a837d64cc05ba1aa909b522e','a3b09446a837d64cc05ba1aa909b522e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa3b09446a837d64cc05ba1aa909b522e" value="sumSquaresTo 4     " /><br /><div class="answer" id="resa3b09446a837d64cc05ba1aa909b522e"><code class="result">30</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','1f69c3e822733c729e7ee72c541abbf5','1f69c3e822733c729e7ee72c541abbf5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1f69c3e822733c729e7ee72c541abbf5" value="sumSquaresTo (-1)  " /><br /><div class="answer" id="res1f69c3e822733c729e7ee72c541abbf5"><code class="result">0</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-divisors" class="level1">
<h1>Exercise: Divisors [*]</h1>
<p>Define a function that generates a list of divisors for a given number.</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="ot">divisors ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_46ba29fcc0b2f0f31ff0c892292408a1.hs','46ba29fcc0b2f0f31ff0c892292408a1','46ba29fcc0b2f0f31ff0c892292408a1');"><textarea cols="80" rows="3" id="tarea46ba29fcc0b2f0f31ff0c892292408a1"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res46ba29fcc0b2f0f31ff0c892292408a1"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','b413be6bd938cb00153b07c0e3615db0','b413be6bd938cb00153b07c0e3615db0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab413be6bd938cb00153b07c0e3615db0" value="divisors 12" /><br /><div class="answer" id="resb413be6bd938cb00153b07c0e3615db0"><code class="result">[1, 2, 3, 4, 6, 12]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-proper-divisors" class="level1">
<h1>Exercise: Proper Divisors</h1>
<p>Define a function that generates a list of proper divisors for a given number.</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="ot">properDivisors ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> [<span class="dt">Integer</span>]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_e691248cb4b7fb438a5bfe1f6abb8b3d.hs','e691248cb4b7fb438a5bfe1f6abb8b3d','e691248cb4b7fb438a5bfe1f6abb8b3d');"><textarea cols="80" rows="4" id="tareae691248cb4b7fb438a5bfe1f6abb8b3d"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="rese691248cb4b7fb438a5bfe1f6abb8b3d"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','68265311ed31cb26dd6f040e739aebc1','68265311ed31cb26dd6f040e739aebc1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea68265311ed31cb26dd6f040e739aebc1" value="properDivisors 12" /><br /><div class="answer" id="res68265311ed31cb26dd6f040e739aebc1"><code class="result">[2, 3, 4, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-regular-polygons" class="level1">
<h1>Exercise: Regular Polygons</h1>
<p>Define regular polygons if the radius of the circumcircle and the number of sides are given.</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="ot">regularPolygon ::</span> <span class="dt">Double</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Diagram</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_1bb9b7493246e23500597182d63f703b.hs','1bb9b7493246e23500597182d63f703b','1bb9b7493246e23500597182d63f703b');"><textarea cols="80" rows="3" id="tarea1bb9b7493246e23500597182d63f703b"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res1bb9b7493246e23500597182d63f703b"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','f0ccee0b7e3138cb7913da4cda3b5e7a','f0ccee0b7e3138cb7913da4cda3b5e7a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf0ccee0b7e3138cb7913da4cda3b5e7a" value="regularPolygon 7 5" /><br /><div class="answer" id="resf0ccee0b7e3138cb7913da4cda3b5e7a"><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"><polygon points="0.000,7.000 6.657,2.163 4.114,-5.663 -4.114,-5.663 -6.657,2.163" style="stroke-width: 0.100; stroke: black; fill: white" transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"></polygon></svg></div></form>
<p>Hint: Use the <code>polygon</code> function, and there may be some <a href="Conversion_en.xml">conversion or rounding</a> needed. Points of the polygon can be given in the (r * cos φ, r * sin φ) form.</p>
</section>
<section id="exercise-stars" class="level1">
<h1>Exercise: Stars</h1>
<p>Define stars by connecting every <code>m</code>th node of an <code>n</code>-side regular polygon if the radius of the circumcircle, <code>n</code>, <code>m</code> are given.</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="ot">star ::</span> <span class="dt">Double</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Diagram</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Definitions_en_04b139f36ece6dbfb95903031540b8b5.hs','04b139f36ece6dbfb95903031540b8b5','04b139f36ece6dbfb95903031540b8b5');"><textarea cols="80" rows="3" id="tarea04b139f36ece6dbfb95903031540b8b5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res04b139f36ece6dbfb95903031540b8b5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','e124623ee8e92178e213ac416eb7a232','e124623ee8e92178e213ac416eb7a232');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae124623ee8e92178e213ac416eb7a232" value="star 7 7 2" /><br /><div class="answer" id="rese124623ee8e92178e213ac416eb7a232"><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"><polygon points="0.000,7.000 6.824,-1.558 -3.037,-6.307 -5.473,4.364 5.473,4.364 3.037,-6.307 -6.824,-1.558" style="stroke-width: 0.100; stroke: black; fill: white" transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"></polygon></svg></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Definitions_en.hs','3c0324b08108cfaaa0b20faab7d29ed3','3c0324b08108cfaaa0b20faab7d29ed3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3c0324b08108cfaaa0b20faab7d29ed3" value="star 7 7 3" /><br /><div class="answer" id="res3c0324b08108cfaaa0b20faab7d29ed3"><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"><polygon points="0.000,7.000 3.037,-6.307 -5.473,4.364 6.824,-1.558 -6.824,-1.558 5.473,4.364 -3.037,-6.307" style="stroke-width: 0.100; stroke: black; fill: white" transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"></polygon></svg></div></form>
</section>
<section id="defining-operators" class="level1">
<h1>Defining Operators</h1>
<div class="sourceCode" id="cb21"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb21-1" data-line-number="1"><span class="ot">(.*.) ::</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>
<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb22-1" data-line-number="1">a <span class="fu">.*.</span> b <span class="fu">=</span> a <span class="fu">*</span> b <span class="fu">+</span> <span class="dv">1</span></a></code></pre></div>
<p>Precedence and associativity for an operator can be set by the <code>infix</code>, <code>infixl</code>, and <code>infixr</code> keywords.</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="kw">infixl</span> <span class="dv">7</span> <span class="fu">.*.</span></a></code></pre></div>
<p>Query the precedence and associativity of an already defined operator.</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="dt">Main</span><span class="fu">*&gt;</span> <span class="fu">:</span>i (<span class="fu">+</span>)</a>
<a class="sourceLine" id="cb24-2" data-line-number="2"><span class="kw">infixl</span> <span class="dv">6</span> <span class="fu">+</span> </a></code></pre></div>
<div class="handout">
<hr />
<p>Operator names may consist of the following ASCII symbols: <code>!?.#$%@&amp;*+-~^/|\&lt;=&gt;:</code>. However, the following keywords are reserved (so they cannot be used as operators): <code>=</code>, <code>..</code>, <code>|</code>, <code>&lt;-</code>, <code>-&gt;</code>, <code>=&gt;</code>, <code>::</code>, <code>\</code>, <code>@</code>, <code>~</code>.</p>
<p>(These must be familiar, except the last three.)</p>
<p>Operators are used in infix notation, that is, the name of the operator is put between the operands.</p>
<p>With the <code>infix</code> <em>n</em> <em>o</em> declaration, the <em>o</em> operator will have <em>no associativity</em> and precedence of <em>n</em>. The precedence may vary between <code>0</code> and <code>9</code>. <code>infixl</code> means “left associative”, and <code>infixr</code> means “right associative”.</p>
</div>
</section>
</body>
</html>

