<?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>Numbers and Types</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<link rel="shortcut icon" href="icon.ico" />
<script src="common_en.js" charset="utf-8" type="text/javascript"></script> 
<link rel="stylesheet" href="common.css" type="text/css" />
</head>
<body onload="javascript:resetForms(); javascript:slidy_init();">
<div><h1 class="cover">Numbers and Types</h1>
<div id="info"></div>
<ul>
<li><a href="#the-haskell-interpreter">The Haskell Interpreter</a></li>
<li><a href="#number-types">Number Types</a></li>
<li><a href="#ad-hoc-polymorphism">Ad-hoc Polymorphism</a></li>
<li><a href="#subtraction-multiplication">Subtraction, Multiplication</a></li>
<li><a href="#division">Division</a></li>
<li><a href="#division-with-remainder">Division with Remainder</a></li>
<li><a href="#exercise-number-of-seconds">Exercise: Number of Seconds</a></li>
<li><a href="#exercise-volume-of-a-sphere">Exercise: Volume of a Sphere</a></li>
<li><a href="#exercise-divisibility">Exercise: Divisibility</a></li>
<li><a href="#raising-to-a-power">Raising to a Power</a></li>
<li><a href="#polymorphic-literals-and-constants">Polymorphic Literals and Constants</a></li>
<li><a href="#precedences">Precedences</a></li>
<li><a href="#exercise">Exercise</a></li>
<li><a href="#negation">Negation</a></li>
<li><a href="#function-application">Function Application</a></li>
<li><a href="#functions-and-operators">Functions and Operators</a></li>
</ul>
</div>
<section id="the-haskell-interpreter" class="level1">
<h1>The Haskell Interpreter</h1>
<p>The most frequently used Haskell interpreters are GHCi and Hugs.</p>
<p>There can be Haskell expressions evaluated or type of expressions queried in such interpreters:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','c84d6c399362c99567fa6252669bf11b','c84d6c399362c99567fa6252669bf11b');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac84d6c399362c99567fa6252669bf11b" value="2 * 6" /><br /><div class="answer" id="resc84d6c399362c99567fa6252669bf11b"><code class="result">12</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','847c091ef24252734eae2052df112955','847c091ef24252734eae2052df112955');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea847c091ef24252734eae2052df112955" value=":t 2 * 6" /><br /><div class="answer" id="res847c091ef24252734eae2052df112955"><code class="result">2 * 6</code><code> :: </code><code class="type">Num a =&gt; a</code></div></form>
<div class="handout">
<hr />
<p>By default, there can be only the functions of the <code>Prelude</code> module used, that is what the displayed <code>Prelude&gt;</code> text says in the prompt after the interpreter has been launched.</p>
<p>With the <code>:s +t</code> command, the interpreter will display the type for each evaluated expression. The <code>:s +t</code> expression is an abbreviation of “set type on”.</p>
</div>
</section>
<section id="number-types" class="level1">
<h1>Number Types</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','8f1a094580f3f70b4150c9c6f2fde7de','8f1a094580f3f70b4150c9c6f2fde7de');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8f1a094580f3f70b4150c9c6f2fde7de" value="3^10 :: Int" /><br /><div class="answer" id="res8f1a094580f3f70b4150c9c6f2fde7de"><code class="result">59049</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','6cae0d2327282522f3a3dab14621383f','6cae0d2327282522f3a3dab14621383f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6cae0d2327282522f3a3dab14621383f" value="3^10 :: Integer" /><br /><div class="answer" id="res6cae0d2327282522f3a3dab14621383f"><code class="result">59049</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','e7c0c3387ec93c4f73b517f921cfa5a8','e7c0c3387ec93c4f73b517f921cfa5a8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae7c0c3387ec93c4f73b517f921cfa5a8" value="3^100 :: Int" /><br /><div class="answer" id="rese7c0c3387ec93c4f73b517f921cfa5a8"><code class="result">-2984622845537545263</code><code> :: </code><code class="type">Int</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','1c2f18377700757ac9d77fd006b3b1f8','1c2f18377700757ac9d77fd006b3b1f8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1c2f18377700757ac9d77fd006b3b1f8" value="3^100 :: Integer" /><br /><div class="answer" id="res1c2f18377700757ac9d77fd006b3b1f8"><code class="result">515377520732011331036461129765621272702107522001</code><code> :: </code><code class="type">Integer</code></div></form>
<p>Some number types:</p>
<table>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code>Integer</code></td>
<td style="text-align: left;">integer</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Int</code></td>
<td style="text-align: left;">bounded integer (-2147483648..2147483647)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>Rational</code></td>
<td style="text-align: left;">rational</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Float</code></td>
<td style="text-align: left;">single-precision floating-point number</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>Double</code></td>
<td style="text-align: left;">double-precision floating-point number</td>
</tr>
</tbody>
</table>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','49982a7bdad049569cc3c819fc6cbaca','49982a7bdad049569cc3c819fc6cbaca');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea49982a7bdad049569cc3c819fc6cbaca" value="5^50 :: Integer" /><br /><div class="answer" id="res49982a7bdad049569cc3c819fc6cbaca"><code class="result">88817841970012523233890533447265625</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','84b1edcfdf3092f38e838fcb93a538b5','84b1edcfdf3092f38e838fcb93a538b5');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea84b1edcfdf3092f38e838fcb93a538b5" value="1/3 :: Rational" /><br /><div class="answer" id="res84b1edcfdf3092f38e838fcb93a538b5"><code class="result">1 :% 3</code><code> :: </code><code class="type">Rational</code></div></form>
<div class="handout">
<hr />
<p>The bounds given above apply to GHC on 32-bit processors.</p>
<p>When the <code>Double</code> type is employed, it implies rounding errors:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','f454420c180747a951cb41e293ba50e8','f454420c180747a951cb41e293ba50e8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf454420c180747a951cb41e293ba50e8" value="1.1 - 1" /><br /><div class="answer" id="resf454420c180747a951cb41e293ba50e8"><code class="result">0.10000000000000009</code><code> :: </code><code class="type">Double</code></div></form>
<p>Other number types:</p>
<table>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code>Ratio Integer</code></td>
<td style="text-align: left;">(= <code>Rational</code>) Quotient of two <code>Integer</code> values</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Ratio Int</code></td>
<td style="text-align: left;">Quotient of two <code>Int</code> values</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>Fixed E6</code></td>
<td style="text-align: left;">(= <code>Micro</code>) Fraction with 6 decimals</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Fixed E12</code></td>
<td style="text-align: left;">(= <code>Pico</code>) Fraction with 12 decimals</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>Complex Float</code></td>
<td style="text-align: left;">Complex number (Pair of <code>Float</code>s)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>Complex Double</code></td>
<td style="text-align: left;">Complex number (Pair of <code>Double</code>s)</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="ad-hoc-polymorphism" class="level1">
<h1>Ad-hoc Polymorphism</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','028f362f9b372b11abf810c2b10373dd','028f362f9b372b11abf810c2b10373dd');"><div class="answer" id="res028f362f9b372b11abf810c2b10373dd"><code class="result">(+)</code><code> :: </code><code class="type">Num a =&gt; a -&gt; a -&gt; a</code><code class="comment"> -- query type</code></div></form>
<p><code>Num a</code> means that <code>a</code> is replaceable with <code>Int</code>, <code>Integer</code>, <code>Rational</code>, <code>Float</code>, <code>Double</code>, …</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="ot">(+) ::</span> <span class="dt">Int</span>      <span class="ot">-&gt;</span> <span class="dt">Int</span>      <span class="ot">-&gt;</span> <span class="dt">Int</span></a>
<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="ot">(+) ::</span> <span class="dt">Integer</span>  <span class="ot">-&gt;</span> <span class="dt">Integer</span>  <span class="ot">-&gt;</span> <span class="dt">Integer</span></a>
<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="ot">(+) ::</span> <span class="dt">Rational</span> <span class="ot">-&gt;</span> <span class="dt">Rational</span> <span class="ot">-&gt;</span> <span class="dt">Rational</span></a>
<a class="sourceLine" id="cb1-4" data-line-number="4"><span class="ot">(+) ::</span> <span class="dt">Double</span>   <span class="ot">-&gt;</span> <span class="dt">Double</span>   <span class="ot">-&gt;</span> <span class="dt">Double</span></a></code></pre></div>
<div class="handout">
<hr />
<p><code>Num</code> is a <em>type class</em>.</p>
<p>There is a <code>Num</code> type class <em>instance</em> for the <code>Int</code> type.</p>
<p>Lowercase names in the types are type variables. Types containing type variables may be specialized, that is the type variables may be replaced with other types by certain constraints.</p>
<p>Type of an n-parameter function:</p>
<p>t<sub>1</sub> <code>-&gt;</code> t<sub>2</sub> <code>-&gt;</code> … <code>-&gt;</code> t<sub>N</sub> <code>-&gt;</code> t<sub>N+1</sub>.</p>
<ul>
<li>t~1, t<sub>2</sub>, …, t<sub>N</sub> are types of the parameters.</li>
<li>t<sub>N+1</sub> is type of the result.</li>
</ul>
</div>
</section>
<section id="subtraction-multiplication" class="level1">
<h1>Subtraction, Multiplication</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','33122c0d866189aedb5e07c6f02d0f82','33122c0d866189aedb5e07c6f02d0f82');"><div class="answer" id="res33122c0d866189aedb5e07c6f02d0f82"><code class="result">(-)</code><code> :: </code><code class="type">Num a =&gt; a -&gt; a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','ff2f3d3c2e1a22650760a7e2e022f9a6','ff2f3d3c2e1a22650760a7e2e022f9a6');"><div class="answer" id="resff2f3d3c2e1a22650760a7e2e022f9a6"><code class="result">(*)</code><code> :: </code><code class="type">Num a =&gt; a -&gt; a -&gt; a</code></div></form>
</section>
<section id="division" class="level1">
<h1>Division</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','b599e9ce4ffde15842731dc7ac9a6dda','b599e9ce4ffde15842731dc7ac9a6dda');"><div class="answer" id="resb599e9ce4ffde15842731dc7ac9a6dda"><code class="result">(/)</code><code> :: </code><code class="type">Fractional a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Fractional a</code> means that <code>a</code> is replaceable with <code>Rational</code>, <code>Float</code>, <code>Double</code>, …</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','30ce3f791246896d1f34334b33dc7c0e','30ce3f791246896d1f34334b33dc7c0e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea30ce3f791246896d1f34334b33dc7c0e" value="1 / 3 " /><br /><div class="answer" id="res30ce3f791246896d1f34334b33dc7c0e"><code class="result">0.3333333333333333</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','3ec4a8ad88c4e1ff344dd2e289f39e36','3ec4a8ad88c4e1ff344dd2e289f39e36');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3ec4a8ad88c4e1ff344dd2e289f39e36" value="1 / 3 :: Int" /><br /><div class="answer" id="res3ec4a8ad88c4e1ff344dd2e289f39e36"><div class="error"><pre class="normal">&lt;interactive&gt;:1:1: error:
    &#8226; No instance for (Fractional Int) arising from a use of &#8216;/&#8217;
    &#8226; In the expression: 1 / 3 :: Int
</pre></div></div></form>
</section>
<section id="division-with-remainder" class="level1">
<h1>Division with Remainder</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','ae33746b28afdf0f4e86adbc3afb2980','ae33746b28afdf0f4e86adbc3afb2980');"><div class="answer" id="resae33746b28afdf0f4e86adbc3afb2980"><code class="result">div</code><code> :: </code><code class="type">Integral a =&gt; a -&gt; a -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','0c59cd6b687c6d59e43be9ec64b5acd7','0c59cd6b687c6d59e43be9ec64b5acd7');"><div class="answer" id="res0c59cd6b687c6d59e43be9ec64b5acd7"><code class="result">mod</code><code> :: </code><code class="type">Integral a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Integral a</code> means that <code>a</code> is replaceable with <code>Int</code> and <code>Integer</code>.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','a162335958bac0f398fbda2206efb519','a162335958bac0f398fbda2206efb519');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa162335958bac0f398fbda2206efb519" value="53 `mod` 5" /><br /><div class="answer" id="resa162335958bac0f398fbda2206efb519"><code class="result">3</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','79f9282e09f42cd3b3a302a2844107a8','79f9282e09f42cd3b3a302a2844107a8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea79f9282e09f42cd3b3a302a2844107a8" value="53 `div` 5" /><br /><div class="answer" id="res79f9282e09f42cd3b3a302a2844107a8"><code class="result">10</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','18a8cd64e61afcb3588d0ea3b7c19237','18a8cd64e61afcb3588d0ea3b7c19237');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea18a8cd64e61afcb3588d0ea3b7c19237" value="53 `mod` 5" /><br /><div class="answer" id="res18a8cd64e61afcb3588d0ea3b7c19237"><code class="result">3</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','27383d90fb21f236a72dafb27000767f','27383d90fb21f236a72dafb27000767f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea27383d90fb21f236a72dafb27000767f" value="53 `div` 5 :: Double" /><br /><div class="answer" id="res27383d90fb21f236a72dafb27000767f"><div class="error"><pre class="normal">&lt;interactive&gt;:1:1: error:
    &#8226; No instance for (Integral Double) arising from a use of &#8216;div&#8217;
    &#8226; In the expression: 53 `div` 5 :: Double
</pre></div></div></form>
</section>
<section id="exercise-number-of-seconds" class="level1">
<h1>Exercise: Number of Seconds</h1>
<p>How many seconds are there in a normal year?</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en_03b7da68b5dbac660176f76a14cc64f6.hs','03b7da68b5dbac660176f76a14cc64f6','03b7da68b5dbac660176f76a14cc64f6');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea03b7da68b5dbac660176f76a14cc64f6" value="" /><br /><div class="answer" id="res03b7da68b5dbac660176f76a14cc64f6"></div></form>
</section>
<section id="exercise-volume-of-a-sphere" class="level1">
<h1>Exercise: Volume of a Sphere</h1>
<p>Determine the volume of the sphere of radius 1.01.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en_4d67843460ae559d775aa30b1617a2fc.hs','4d67843460ae559d775aa30b1617a2fc','4d67843460ae559d775aa30b1617a2fc');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea4d67843460ae559d775aa30b1617a2fc" value="" /><br /><div class="answer" id="res4d67843460ae559d775aa30b1617a2fc"></div></form>
<p>Note: You can use <code>pi</code> instead of π, the volume of sphere is given by the formula 4r<sup>3</sup>π/3.</p>
</section>
<section id="exercise-divisibility" class="level1">
<h1>Exercise: Divisibility</h1>
<p>Write an expression with numerical value that helps to find out whether <code>23</code> divides <code>532253373</code> or not.</p>
<form class="interpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en_6f6c3d652f6b014eef7bcff7b87bd360.hs','6f6c3d652f6b014eef7bcff7b87bd360','6f6c3d652f6b014eef7bcff7b87bd360');"><code class="prompt">Solution&gt; </code><input class="interpreter" type="text" size="80" id="tarea6f6c3d652f6b014eef7bcff7b87bd360" value="" /><br /><div class="answer" id="res6f6c3d652f6b014eef7bcff7b87bd360"></div></form>
</section>
<section id="raising-to-a-power" class="level1">
<h1>Raising to a Power</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','15eecc90cb7d59e589d5dd0848311b54','15eecc90cb7d59e589d5dd0848311b54');"><div class="answer" id="res15eecc90cb7d59e589d5dd0848311b54"><code class="result">(^)</code><code> :: </code><code class="type">(Integral b, Num a) =&gt; a -&gt; b -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','1c2438fdfe9af4f8f13a2bc68802e4cf','1c2438fdfe9af4f8f13a2bc68802e4cf');"><div class="answer" id="res1c2438fdfe9af4f8f13a2bc68802e4cf"><code class="result">(^^)</code><code> :: </code><code class="type">(Fractional a, Integral b) =&gt; a -&gt; b -&gt; a</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','b2efb5c1c388e382bc5a282d015a091f','b2efb5c1c388e382bc5a282d015a091f');"><div class="answer" id="resb2efb5c1c388e382bc5a282d015a091f"><code class="result">(**)</code><code> :: </code><code class="type">Floating a =&gt; a -&gt; a -&gt; a</code></div></form>
<p><code>Floating a</code> means that <code>a</code> is replaceable with <code>Float</code>, <code>Double</code>, …</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','3409c26804233cbcf07f5ef564651558','3409c26804233cbcf07f5ef564651558');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3409c26804233cbcf07f5ef564651558" value="(1 + 1/10000000000) ^ 10000000000" /><br /><div class="answer" id="res3409c26804233cbcf07f5ef564651558"><code class="result">2.718282043475248</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','51fdbdbf3423b3bdca0b744a570481b3','51fdbdbf3423b3bdca0b744a570481b3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea51fdbdbf3423b3bdca0b744a570481b3" value="2 ^^ (-1)" /><br /><div class="answer" id="res51fdbdbf3423b3bdca0b744a570481b3"><code class="result">0.5</code><code> :: </code><code class="type">Double</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','a76446935b4854d933f130d4bae17d0f','a76446935b4854d933f130d4bae17d0f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa76446935b4854d933f130d4bae17d0f" value="2 ** 0.5" /><br /><div class="answer" id="resa76446935b4854d933f130d4bae17d0f"><code class="result">1.4142135623730951</code><code> :: </code><code class="type">Double</code></div></form>
<div class="handout">
<hr />
<p>There are three types of raising to a power depending on whether the power is a non-negative integer, integer, or floating-point value.</p>
</div>
</section>
<section id="polymorphic-literals-and-constants" class="level1">
<h1>Polymorphic Literals and Constants</h1>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','af7aa6b81f44595ea965354c2682d6fe','af7aa6b81f44595ea965354c2682d6fe');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaf7aa6b81f44595ea965354c2682d6fe" value=":t 1230" /><br /><div class="answer" id="resaf7aa6b81f44595ea965354c2682d6fe"><code class="result">1230</code><code> :: </code><code class="type">Num p =&gt; p</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','e00d1884236f0fe88d34a29d8d2eb77c','e00d1884236f0fe88d34a29d8d2eb77c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae00d1884236f0fe88d34a29d8d2eb77c" value=":t 1.1" /><br /><div class="answer" id="rese00d1884236f0fe88d34a29d8d2eb77c"><code class="result">1.1</code><code> :: </code><code class="type">Fractional p =&gt; p</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','99bc23d8911b2927175a50fc6fd02faf','99bc23d8911b2927175a50fc6fd02faf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea99bc23d8911b2927175a50fc6fd02faf" value=":t pi" /><br /><div class="answer" id="res99bc23d8911b2927175a50fc6fd02faf"><code class="result">pi</code><code> :: </code><code class="type">Floating a =&gt; a</code></div></form>
<p>Specializing the type of a polymorphic expression:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','71c53d17ea8eae7ef8a092daa49c2361','71c53d17ea8eae7ef8a092daa49c2361');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea71c53d17ea8eae7ef8a092daa49c2361" value="1230 :: Rational" /><br /><div class="answer" id="res71c53d17ea8eae7ef8a092daa49c2361"><code class="result">1230 :% 1</code><code> :: </code><code class="type">Rational</code></div></form>
<p>Exercises:</p>
<ol type="1">
<li>Why the type of <code>1 + 1.1</code> is correct?</li>
<li>What is the type of <code>3</code> in the expression <code>(1 + 3) / 4</code>?</li>
</ol>
<div class="handout">
<hr />
<p>An expression is correct by type if the specialized type of all function arguments matches the types required by the respective functions.</p>
<p>During specialization, the type variables are replaced by an arbitrary type.</p>
<p>For example, specializations of <code>a -&gt; a</code>: <code>Char -&gt; Char</code>, <code>[b] -&gt; [b]</code>, …</p>
<p>There is a sub-class relation between type classes:</p>
<p><img src="Syntax_en42e12d624072be4cba0c94e761443455.png" alt="Syntax_en42e12d624072be4cba0c94e761443455.png" /></p>
<p>That offers an opportunity for a different kind of type specialization. For example, the <code>Fractional a</code> property implies <code>Num a</code>.<br />
Hence the <code>Num</code> may be replaced by <code>Fractional</code> during the specialization.</p>
<p>That is, the specialized type of</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','a48768e896edbea2fc8704e513a6ba29','a48768e896edbea2fc8704e513a6ba29');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa48768e896edbea2fc8704e513a6ba29" value="2 :: Num a =&gt; a" /><br /><div class="answer" id="resa48768e896edbea2fc8704e513a6ba29"></div></form>
<p>is</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','5215552910fc0c93c4c3e0785aec8dbf','5215552910fc0c93c4c3e0785aec8dbf');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea5215552910fc0c93c4c3e0785aec8dbf" value="2 :: Fractional a =&gt; a" /><br /><div class="answer" id="res5215552910fc0c93c4c3e0785aec8dbf"></div></form>
</div>
</section>
<section id="precedences" class="level1">
<h1>Precedences</h1>
<p>Precedences from stronger to weaker:</p>
<table>
<tbody>
<tr class="odd">
<td style="text-align: center;"><code>^</code>, <code>^^</code>, <code>**</code></td>
<td style="text-align: center;">associativity: (.(.))</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>*</code>, <code>/</code></td>
<td style="text-align: center;">associativity: ((.).)</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>+</code>, <code>-</code></td>
<td style="text-align: center;">associativity: ((.).)</td>
</tr>
</tbody>
</table>
<p>For example, <code>3 - 3 ^ 3 ^ 3 - 3</code> with parentheses added:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','ded3e400335eb7b35aaea81f8eb10b53','ded3e400335eb7b35aaea81f8eb10b53');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaded3e400335eb7b35aaea81f8eb10b53" value="(3 - (3 ^ (3 ^ 3))) - 3" /><br /><div class="answer" id="resded3e400335eb7b35aaea81f8eb10b53"></div></form>
<div class="handout">
<hr />
<p>Interpretation of precedence is as usual: <code>1 + 2 * 4</code> written with parentheses is <code>1 + (2 * 4)</code>.</p>
<p>The associativity is only relevant if there operators on the same level of precedence are next to each other. Hence <code>1/2/4</code> should be written as <code>(1/2)/4</code> with parentheses added, while <code>3^3^3</code> should be written as <code>3^(3^3)</code>.</p>
</div>
</section>
<section id="exercise" class="level1">
<h1>Exercise</h1>
<p>Add parentheses.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','a06617e9dd9a7fec323a69c2203a7ffc','a06617e9dd9a7fec323a69c2203a7ffc');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa06617e9dd9a7fec323a69c2203a7ffc" value="1 + 2 * 3 ** 4 / 5" /><br /><div class="answer" id="resa06617e9dd9a7fec323a69c2203a7ffc"><code class="result">33.4</code><code> :: </code><code class="type">Double</code></div></form>
</section>
<section id="negation" class="level1">
<h1>Negation</h1>
<p>Negation is the only prefix operator, it is denoted by <code>-</code> similarly to subtraction.<br />
The precedence of negation is the same as the precedence of subtraction.</p>
<p><code>- 6 - 2</code> is <code>(- 6) - 2</code>,<br />
<code>- 6 ^ 2</code> is <code>- (6 ^ 2)</code>.</p>
<p>Invalid expression:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','6b2da8620e89d6402d3b9d836ebcf002','6b2da8620e89d6402d3b9d836ebcf002');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6b2da8620e89d6402d3b9d836ebcf002" value="3 + -11" /><br /><div class="answer" id="res6b2da8620e89d6402d3b9d836ebcf002"><div class="error"><pre class="normal">&lt;interactive&gt;:1:1: error:
    Precedence parsing error
        cannot mix &#8216;+&#8217; [infixl 6] and prefix `-' [infixl 6] in the same infix expression
</pre></div></div></form>
<p>The correct form is:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','03ce56e46ab4c3fde0f080b49208917e','03ce56e46ab4c3fde0f080b49208917e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea03ce56e46ab4c3fde0f080b49208917e" value="3 + (-11)" /><br /><div class="answer" id="res03ce56e46ab4c3fde0f080b49208917e"><code class="result">-8</code><code> :: </code><code class="type">Integer</code></div></form>
<div class="handout">
<hr />
<p>Negation can be distinguished from subtraction as follows. If the <code>-</code> symbol follows an expression then it refers to a subtraction otherwise that is a negation. There is no negative number literal, e.g. the <code>-13</code> expression is the negation of <code>13</code> thus negative numbers must be protected by parentheses.</p>
</div>
</section>
<section id="function-application" class="level1">
<h1>Function Application</h1>
<p>Function application does not require parentheses and comma.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','f90de8e950f82324f6eea5dd7ff4aaf3','f90de8e950f82324f6eea5dd7ff4aaf3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf90de8e950f82324f6eea5dd7ff4aaf3" value="div 60 12" /><br /><div class="answer" id="resf90de8e950f82324f6eea5dd7ff4aaf3"></div></form>
<p>Invalid expression: sin cos 1</p>
<p>The correct form is:</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','aac91093dbcbd76630a59c3d2a816ed8','aac91093dbcbd76630a59c3d2a816ed8');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaaac91093dbcbd76630a59c3d2a816ed8" value="sin (cos 1)" /><br /><div class="answer" id="resaac91093dbcbd76630a59c3d2a816ed8"></div></form>
<p>Function application has the strongest precedence:<br />
<code>sin pi + 1</code> is <code>(sin pi) + 1</code>.</p>
<div class="handout">
<hr />
<p>The function and the operator are syntactical categories. Function names consist of letters and they start with a lowercase letter, while operators consist of graphical characters.</p>
<p>Graphical characters are the <code>!?.#$%@&amp;*+-~^/|\&lt;=&gt;</code> ASCII characters and the symbols from non-ASCII characters.</p>
<p>It is allowed to use parentheses as arbitrary expression may be put in parentheses if that does not change the order to evaluation, e.g. <code>sin(pi)</code>.</p>
<p>Note that <code>sin cos 1</code> is an invalid expression, because it says that <code>sin</code> is two-parameter function that is passed the <code>cos</code> and <code>1</code> arguments.</p>
</div>
</section>
<section id="functions-and-operators" class="level1">
<h1>Functions and Operators</h1>
<p>Functions with two parameters may be used in infix notation.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','a43d89b1285dc7e1165ade158ffca350','a43d89b1285dc7e1165ade158ffca350');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa43d89b1285dc7e1165ade158ffca350" value="13 `div` 2" /><br /><div class="answer" id="resa43d89b1285dc7e1165ade158ffca350"></div></form>
<p>Operators may be used in prefix notation.</p>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Syntax_en.hs','05303168f145c87cbfc25cc03f03278a','05303168f145c87cbfc25cc03f03278a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea05303168f145c87cbfc25cc03f03278a" value="(+) 1 2" /><br /><div class="answer" id="res05303168f145c87cbfc25cc03f03278a"></div></form>
<div class="handout">
<hr />
<p>Function names may be used in infix notation by putting them in `` symbols. Operator names may be used in prefix notation by putting in parentheses.</p>
<p>The infix <code>div</code> and <code>mod</code> functions have the same precedence as the <code>*</code> and <code>/</code> operators.</p>
</div>
</section>
</body>
</html>

