hl/static/report/haskell2010/haskellch3.html
2014-03-15 03:18:15 +01:00

7600 lines
338 KiB
HTML

<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd-->
<html xmlns="http://www.w3.org/1999/xhtml"
>
<head><title>3 Expressions</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" />
<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" />
<!-- 2,html,xhtml -->
<meta name="src" content="haskell.tex" />
<meta name="date" content="2010-07-20 13:11:00" />
<link rel="stylesheet" type="text/css" href="haskell.css" />
</head><body
>
<!--l. 7--><div class="crosslinks"><p class="noindent">[<a
href="haskellch4.html" >next</a>] [<a
href="haskellch2.html" >prev</a>] [<a
href="haskellch2.html#tailhaskellch2.html" >prev-tail</a>] [<a
href="#tailhaskellch3.html">tail</a>] [<a
href="haskellpa1.html#haskellch3.html" >up</a>] </p></div>
<h2 class="chapterHead"><span class="titlemark">Chapter&#x00A0;3</span><br /><a
id="x8-220003"></a>Expressions</h2><a
id="dx8-22001"></a>
<p class="noindent"> In this chapter, we describe the syntax and informal semantics of Haskell <span
class="ptmri7t-">expressions</span>, including their translations
into the Haskell kernel, where appropriate. Except in the case of <span
class="pcrr7t-">let</span> expressions, these translations preserve both the
static and dynamic semantics. Free variables and constructors used in these translations always refer to entities
defined by the <span
class="pcrr7t-">Prelude</span>. For example, &#8220;<span
class="pcrr7t-">concatMap</span>&#8221; used in the translation of list comprehensions
(Section&#x00A0;<a
href="#x8-420003.11">3.11<!--tex4ht:ref: list-comprehensions --></a>) means the <span
class="pcrr7t-">concatMap</span> defined by the <span
class="pcrr7t-">Prelude</span>, regardless of whether or not the identifier
&#8220;<span
class="pcrr7t-">concatMap</span>&#8221; is in scope where the list comprehension is used, and (if it is in scope) what it is bound
to.
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-12" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-12-1g"><col
id="TBL-12-1" /><col
id="TBL-12-2" /><col
id="TBL-12-3" /><col
id="TBL-12-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-12-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-1-1"
class="td11"> <span
class="cmmi-10">exp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-12-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-1-3"
class="td11"> <span
class="cmmi-10">infixexp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">::</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="cmmi-10">context</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=&#x003E;</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;type</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>expression&#x00A0;type&#x00A0;signature<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-2-3"
class="td11"> <span
class="cmmi-10">infixexp</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-3-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-12-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-4-1"
class="td11"></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-5-1"
class="td11"> <span
class="cmmi-10">infixexp</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-5-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-5-3"
class="td11"> <span
class="cmmi-10">lexp</span><span
class="cmmi-10">&#x00A0;qop</span><span
class="cmmi-10">&#x00A0;infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-5-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>infix&#x00A0;operator&#x00A0;application<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-6-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-6-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-6-3"
class="td11"> <span
class="pcrr7t-">-</span><span
class="cmmi-10">&#x00A0;infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-6-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>prefix&#x00A0;negation<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-7-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-7-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-7-3"
class="td11"> <span
class="cmmi-10">lexp</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-8-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-8-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-12-9-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-9-1"
class="td11"></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-10-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-10-1"
class="td11"> <span
class="cmmi-10">lexp</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-10-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-10-3"
class="td11"> <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;apat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;apat</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-10-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>lambda&#x00A0;abstraction<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-11-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-11-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-11-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-11-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">in</span><span
class="cmmi-10">&#x00A0;exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-11-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>let&#x00A0;expression<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-12-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-12-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-12-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-12-3"
class="td11"> <span
class="pcrr7t-">if</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">;</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">then</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">;</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">else</span><span
class="cmmi-10">&#x00A0;exp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-12-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>conditional<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-13-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-13-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-13-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-13-3"
class="td11"> <span
class="pcrr7t-">case</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">of</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;alts</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-13-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>case&#x00A0;expression<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-14-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-14-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-14-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-14-3"
class="td11"> <span
class="pcrr7t-">do</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;stmts</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-14-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>do&#x00A0;expression<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-15-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-15-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-15-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-15-3"
class="td11"> <span
class="cmmi-10">fexp </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-16-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-16-1"
class="td11"> <span
class="cmmi-10">fexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-12-16-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-16-3"
class="td11"> <span
class="cmr-10">[</span><span
class="cmmi-10">fexp</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;aexp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-16-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>function&#x00A0;application<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-17-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-17-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-18-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-18-1"
class="td11"> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-19-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-19-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-12-19-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-19-3"
class="td11"> <span
class="cmmi-10">qvar </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-19-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>variable<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-20-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-20-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-20-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-20-3"
class="td11"> <span
class="cmmi-10">gcon </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-20-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>general&#x00A0;constructor<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-21-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-21-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-21-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-21-3"
class="td11"> <span
class="cmmi-10">literal </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-22-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-22-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-22-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-22-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-22-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>parenthesized&#x00A0;expression<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-23-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-23-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-23-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-23-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-23-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>tuple<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">2) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-24-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-24-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-24-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-24-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-24-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>list<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-25-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-25-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-25-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-25-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">2</span></sub><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">..</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="cmmi-10">exp</span><sub><span
class="cmr-7">3</span></sub><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-25-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>arithmetic&#x00A0;sequence<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-26-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-26-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-26-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-26-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;qual</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;qual</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-26-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>list&#x00A0;comprehension<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-27-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-27-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-27-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-27-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">infixexp</span><span
class="cmmi-10">&#x00A0;qop</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-27-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>left&#x00A0;section<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-28-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-28-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-28-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-28-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">qop</span><sub><span
class="cmsy-7">&#x27E8;</span><span
class="pcrr7t-">-</span><span
class="cmsy-7">&#x27E9;</span></sub><span
class="cmmi-10">&#x00A0;infixexp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-28-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>right&#x00A0;section<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-29-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-29-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-29-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-29-3"
class="td11"> <span
class="cmmi-10">qcon</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-29-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>labeled&#x00A0;construction<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">0) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-30-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-30-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-12-30-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-30-3"
class="td11"> <span
class="cmmi-10">aexp</span><sub><span
class="cmsy-7">&#x27E8;</span><span
class="cmmi-7">qcon</span><span
class="cmsy-7">&#x27E9;</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-30-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>labeled&#x00A0;update<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n</span><span
class="cmmi-10">&#x00A0; </span><span
class="cmsy-10">&ge;</span> <span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-31-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-31-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-12-32-"><td style="white-space:nowrap; text-align:left;" id="TBL-12-32-1"
class="td11"> </td>
</tr></table></div></div>
<a
id="dx8-22002"></a>
<a
id="dx8-22003"></a>
<a
id="dx8-22004"></a>
<a
id="dx8-22005"></a>
<a
id="dx8-22006"></a>
<p class="noindent"> Expressions involving infix operators are disambiguated by the operator&#8217;s fixity (see Section&#x00A0;<a
href="haskellch4.html#x10-820004.4.2">4.4.2<!--tex4ht:ref: fixity --></a>). Consecutive
unparenthesized operators with the same precedence must both be either left or right associative to avoid a syntax
error. Given an unparenthesized expression &#8220;<span
class="cmmi-10">x</span><span
class="cmmi-10">&#x00A0;qop</span><sup><span
class="cmr-7">(</span><span
class="cmmi-7">a,i</span><span
class="cmr-7">)</span></sup><span
class="cmmi-10">&#x00A0;y</span><span
class="cmmi-10">&#x00A0;qop</span><sup><span
class="cmr-7">(</span><span
class="cmmi-7">b,j</span><span
class="cmr-7">)</span></sup><span
class="cmmi-10">&#x00A0;z</span>&#8221; (where <span
class="cmmi-10">qop</span><sup><span
class="cmr-7">(</span><span
class="cmmi-7">a,i</span><span
class="cmr-7">)</span></sup> means an operator with
associativity <span
class="cmmi-10">a</span> and precedence <span
class="cmmi-10">i</span>), parentheses must be added around either &#8220;<span
class="cmmi-10">x</span><span
class="cmmi-10">qop</span><sup><span
class="cmr-7">(</span><span
class="cmmi-7">a,i</span><span
class="cmr-7">)</span></sup><span
class="cmmi-10">&#x00A0;y</span>&#8221; or &#8220;<span
class="cmmi-10">y</span><span
class="cmmi-10">&#x00A0;qop</span><sup><span
class="cmr-7">(</span><span
class="cmmi-7">b,j</span><span
class="cmr-7">)</span></sup><span
class="cmmi-10">&#x00A0;z</span>&#8221; when
<span
class="cmmi-10">i </span><span
class="cmr-10">= </span><span
class="cmmi-10">j</span> unless <span
class="cmmi-10">a </span><span
class="cmr-10">= </span><span
class="cmmi-10">b </span><span
class="cmr-10">=</span> <span
class="cmmi-10">l</span> or <span
class="cmmi-10">a </span><span
class="cmr-10">= </span><span
class="cmmi-10">b </span><span
class="cmr-10">=</span> <span
class="cmmi-10">&#x00A0;r</span>.
<p class="noindent"> An example algorithm for resolving expressions involving infix operators is given in Section&#x00A0;<a
href="haskellch10.html#x17-18100010.6">10.6<!--tex4ht:ref: fixity-resolution --></a>.
<p class="noindent"> Negation<a
id="dx8-22007"></a> is the only prefix operator in Haskell; it has the same precedence as the infix <span
class="pcrr7t-">-</span> operator defined in the
Prelude (see Section&#x00A0;<a
href="haskellch4.html#x10-820004.4.2">4.4.2<!--tex4ht:ref: fixity --></a>, Figure&#x00A0;<a
href="haskellch4.html#x10-820061">4.1<!--tex4ht:ref: prelude-fixities --></a>).
<p class="noindent"> The grammar is ambiguous regarding the extent of lambda abstractions, let expressions, and conditionals.
The ambiguity is resolved by the meta-rule that each of these constructs extends as far to the right as
possible.
<p class="noindent"> Sample parses are shown below.
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-13" class="tabular"
cellspacing="0" cellpadding="0" rules="groups"
><colgroup id="TBL-13-1g"><col
id="TBL-13-1" /></colgroup><colgroup id="TBL-13-2g"><col
id="TBL-13-2" /></colgroup><tr
class="hline"><td><hr /></td><td><hr /></td></tr><tr
style="vertical-align:baseline;" id="TBL-13-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-1-1"
class="td11"> This </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-1-2"
class="td11"> Parses as </td></tr><tr
class="hline"><td><hr /></td><td><hr /></td></tr><tr
style="vertical-align:baseline;" id="TBL-13-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-2-1"
class="td11"> <span
class="pcrr7t-">f</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;g</span><span
class="pcrr7t-">&#x00A0;y</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-2-2"
class="td11"> <span
class="pcrr7t-">(f</span><span
class="pcrr7t-">&#x00A0;x)</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;(g</span><span
class="pcrr7t-">&#x00A0;y)</span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-13-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-3-1"
class="td11"> <span
class="pcrr7t-">-</span><span
class="pcrr7t-">&#x00A0;f</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-3-2"
class="td11"> <span
class="pcrr7t-">(-</span><span
class="pcrr7t-">&#x00A0;(f</span><span
class="pcrr7t-">&#x00A0;x))</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-13-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-4-1"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="pcrr7t-">&#x00A0;...</span><span
class="pcrr7t-">&#x00A0;}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-4-2"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="pcrr7t-">&#x00A0;...</span><span
class="pcrr7t-">&#x00A0;}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;(x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-13-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-5-1"
class="td11"> <span
class="pcrr7t-">z</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="pcrr7t-">&#x00A0;...</span><span
class="pcrr7t-">&#x00A0;}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-5-2"
class="td11"> <span
class="pcrr7t-">z</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;(let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="pcrr7t-">&#x00A0;...</span><span
class="pcrr7t-">&#x00A0;}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;(x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y))</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-13-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-6-1"
class="td11"> <span
class="pcrr7t-">f</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;y</span><span
class="pcrr7t-">&#x00A0;::</span><span
class="pcrr7t-">&#x00A0;Int</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-6-2"
class="td11"> <span
class="pcrr7t-">(f</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;y)</span><span
class="pcrr7t-">&#x00A0;::</span><span
class="pcrr7t-">&#x00A0;Int</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-13-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-7-1"
class="td11"> <span
class="pcrr7t-">\</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;a+b</span><span
class="pcrr7t-">&#x00A0;::</span><span
class="pcrr7t-">&#x00A0;Int</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-13-7-2"
class="td11"> <span
class="pcrr7t-">\</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;((a+b)</span><span
class="pcrr7t-">&#x00A0;::</span><span
class="pcrr7t-">&#x00A0;Int</span>) </td>
</tr><tr
class="hline"><td><hr /></td><td><hr /></td></tr><tr
style="vertical-align:baseline;" id="TBL-13-8-"><td style="white-space:nowrap; text-align:left;" id="TBL-13-8-1"
class="td11"> </td>
</tr></table> </div>
<p class="noindent"> For the sake of clarity, the rest of this section will assume that expressions involving infix operators have been
resolved according to the fixities of the operators.
<h3 class="sectionHead"><span class="titlemark">3.1 </span> <a
id="x8-230003.1"></a>Errors</h3>
<a
id="dx8-23001"></a>
<p class="noindent"> Errors during expression evaluation, denoted by <span
class="cmsy-10">&perp;</span><a
id="dx8-23002"></a> (&#8220;bottom&#8221;<a
id="dx8-23003"></a>), are indistinguishable by a Haskell program from
non-termination. Since Haskell is a non-strict language, all Haskell types include <span
class="cmsy-10">&perp;</span>. That is, a value of any type may
be bound to a computation that, when demanded, results in an error. When evaluated, errors cause immediate program
termination and cannot be caught by the user. The Prelude provides two functions to directly cause such errors:
<div class="quote">
<div class="verbatim" id="verbatim-6">
error&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;::&#x00A0;String&#x00A0;-&#x003E;&#x00A0;a
&#x00A0;<br />undefined&#x00A0;::&#x00A0;a
</div>
<p class="noindent"></div>
<a
id="dx8-23004"></a>
<a
id="dx8-23005"></a>
<p class="noindent"> A call to <span
class="pcrr7t-">error</span> terminates execution of the program and returns an appropriate error indication to the operating
system. It should also display the string in some system-dependent manner. When <span
class="pcrr7t-">undefined</span> is used, the error
message is created by the compiler.
<p class="noindent"> Translations of Haskell expressions use <span
class="pcrr7t-">error</span> and <span
class="pcrr7t-">undefined</span> to explicitly indicate where execution time errors
may occur. The actual program behavior when an error occurs is up to the implementation. The messages passed to
the <span
class="pcrr7t-">error</span> function in these translations are only suggestions; implementations may choose to display more or less
information when an error occurs.
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.2 </span> <a
id="x8-240003.2"></a>Variables, Constructors, Operators, and Literals</h3>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-14" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-14-1g"><col
id="TBL-14-1" /><col
id="TBL-14-2" /><col
id="TBL-14-3" /><col
id="TBL-14-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-14-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-14-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-14-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-14-1-3"
class="td11"> <span
class="cmmi-10">qvar </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-14-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>variable<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-14-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-14-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-14-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-14-2-3"
class="td11"> <span
class="cmmi-10">gcon </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-14-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>general&#x00A0;constructor<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-14-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-14-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-14-3-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-14-3-3"
class="td11"> <span
class="cmmi-10">literal </span></td>
</tr></table></div></div>
<a
id="dx8-24001"></a>
<a
id="dx8-24002"></a>
<a
id="dx8-24003"></a>
<a
id="dx8-24004"></a>
<a
id="dx8-24005"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-15" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-15-1g"><col
id="TBL-15-1" /><col
id="TBL-15-2" /><col
id="TBL-15-3" /><col
id="TBL-15-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-15-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-1-1"
class="td11"> <span
class="cmmi-10">gcon </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-1-3"
class="td11"> <span
class="pcrr7t-">()</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-15-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-2-3"
class="td11"> <span
class="pcrr7t-">[]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-15-3-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-3-3"
class="td11"> <span
class="pcrr7t-">(,</span><span
class="cmsy-10">{</span><span
class="pcrr7t-">,</span><span
class="cmsy-10">}</span><span
class="pcrr7t-">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-15-4-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-4-3"
class="td11"> <span
class="cmmi-10">qcon </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-5-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-15-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-6-1"
class="td11"></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-7-1"
class="td11"> <span
class="cmmi-10">var </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-7-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-7-3"
class="td11"> <span
class="cmmi-10">varid</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;varsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-7-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>variable<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-8-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-8-1"
class="td11"> <span
class="cmmi-10">qvar </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-8-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-8-3"
class="td11"> <span
class="cmmi-10">qvarid</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;qvarsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-8-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>qualified&#x00A0;variable<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-9-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-9-1"
class="td11"> <span
class="cmmi-10">con </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-9-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-9-3"
class="td11"> <span
class="cmmi-10">conid</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;consym</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-9-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>constructor<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-10-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-10-1"
class="td11"> <span
class="cmmi-10">qcon </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-10-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-10-3"
class="td11"> <span
class="cmmi-10">qconid</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;gconsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-10-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>qualified&#x00A0;constructor<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-11-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-11-1"
class="td11"> <span
class="cmmi-10">varop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-11-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-11-3"
class="td11"> <span
class="cmmi-10">varsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> <span
class="cmmi-10">&#x00A0;varid</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-11-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>variable&#x00A0;operator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-12-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-12-1"
class="td11"> <span
class="cmmi-10">qvarop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-12-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-12-3"
class="td11"> <span
class="cmmi-10">qvarsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> <span
class="cmmi-10">&#x00A0;qvarid</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-12-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>qualified&#x00A0;variable&#x00A0;operator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-13-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-13-1"
class="td11"> <span
class="cmmi-10">conop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-13-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-13-3"
class="td11"> <span
class="cmmi-10">consym</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> <span
class="cmmi-10">&#x00A0;conid</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-13-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>constructor&#x00A0;operator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-14-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-14-1"
class="td11"> <span
class="cmmi-10">qconop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-14-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-14-3"
class="td11"> <span
class="cmmi-10">gconsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> <span
class="cmmi-10">&#x00A0;qconid</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-14-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>qualified&#x00A0;constructor&#x00A0;operator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-15-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-15-1"
class="td11"> <span
class="cmmi-10">op </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-15-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-15-3"
class="td11"> <span
class="cmmi-10">varop</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;conop </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-15-15-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>operator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-16-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-16-1"
class="td11"> <span
class="cmmi-10">qop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-16-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-16-3"
class="td11"> <span
class="cmmi-10">qvarop</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;qconop </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-15-16-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>qualified&#x00A0;operator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-15-17-"><td style="white-space:nowrap; text-align:left;" id="TBL-15-17-1"
class="td11"> <span
class="cmmi-10">gconsym </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-15-17-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-17-3"
class="td11"> <span
class="pcrr7t-">:</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;qconsym </span></td>
</tr></table></div></div>
<a
id="dx8-24006"></a>
<a
id="dx8-24007"></a>
<a
id="dx8-24008"></a>
<a
id="dx8-24009"></a>
<a
id="dx8-24010"></a>
<a
id="dx8-24011"></a>
<a
id="dx8-24012"></a>
<a
id="dx8-24013"></a>
<a
id="dx8-24014"></a>
<a
id="dx8-24015"></a>
<a
id="dx8-24016"></a>
<p class="noindent"> Haskell provides special syntax to support infix notation. An <span
class="ptmri7t-">operator </span>is a function that can be applied using infix
syntax (Section&#x00A0;<a
href="#x8-280003.4">3.4<!--tex4ht:ref: operators --></a>), or partially applied using a <span
class="ptmri7t-">section </span>(Section&#x00A0;<a
href="#x8-300003.5">3.5<!--tex4ht:ref: sections --></a>).
<p class="noindent"> An <span
class="ptmri7t-">operator </span>is either an <span
class="ptmri7t-">operator symbol</span>, such as <span
class="pcrr7t-">+</span> or <span
class="pcrr7t-">$$</span>, or is an ordinary identifier enclosed in grave accents
(backquotes), such as <span
class="pcrr7t-">`</span> <span
class="pcrr7t-">op</span> <span
class="pcrr7t-">`</span>. For example, instead of writing the prefix application <span
class="pcrr7t-">op</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;y</span>, one can write the infix
application <span
class="pcrr7t-">x</span><span
class="pcrr7t-">`</span> <span
class="pcrr7t-">op</span> <span
class="pcrr7t-">`</span><span
class="pcrr7t-">&#x00A0;y</span>. If no fixity<a
id="dx8-24017"></a> declaration is given for <span
class="pcrr7t-">`</span> <span
class="pcrr7t-">op</span> <span
class="pcrr7t-">`</span> then it defaults to highest precedence and left
associativity (see Section&#x00A0;<a
href="haskellch4.html#x10-820004.4.2">4.4.2<!--tex4ht:ref: fixity --></a>).
<p class="noindent"> Dually, an operator symbol can be converted to an ordinary identifier by enclosing it in parentheses. For example,
<span
class="pcrr7t-">(+)</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;y</span> is equivalent to <span
class="pcrr7t-">x</span><span
class="pcrr7t-">&#x00A0;+</span><span
class="pcrr7t-">&#x00A0;y</span>, and <span
class="pcrr7t-">foldr</span><span
class="pcrr7t-">&#x00A0;(&#x22C6;)</span><span
class="pcrr7t-">&#x00A0;1</span><span
class="pcrr7t-">&#x00A0;xs</span> is equivalent to <span
class="pcrr7t-">foldr</span><span
class="pcrr7t-">&#x00A0;(\x</span><span
class="pcrr7t-">&#x00A0;y</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x&#x22C6;y)</span><span
class="pcrr7t-">&#x00A0;1</span><span
class="pcrr7t-">&#x00A0;xs</span>.
<p class="noindent"> Special syntax is used to name some constructors for some of the built-in types, as found in the production for <span
class="cmmi-10">gcon</span>
and <span
class="cmmi-10">literal</span>. These are described in Section&#x00A0;<a
href="haskellch6.html#x13-1170006.1">6.1<!--tex4ht:ref: basic-types --></a>.
<a
id="dx8-24018"></a>
<p class="noindent"> An integer literal represents the application of the function <span
class="pcrr7t-">fromInteger</span><a
id="dx8-24019"></a> to the appropriate value of type
<span
class="pcrr7t-">Integer</span>. Similarly, a floating point literal stands for an application of <span
class="pcrr7t-">fromRational</span><a
id="dx8-24020"></a> to a value of type
<span
class="pcrr7t-">Rational</span> (that is, <span
class="pcrr7t-">Ratio</span><span
class="pcrr7t-">&#x00A0;Integer</span>).
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-250003.2"></a>Translation:</span>
The integer literal <span
class="cmmi-10">i</span> is equivalent to <span
class="pcrr7t-">fromInteger</span> <span
class="cmmi-10">i</span>, where <span
class="pcrr7t-">fromInteger</span> is a method in class <span
class="pcrr7t-">Num</span> (see
Section <a
href="haskellch6.html#x13-1360006.4.1">6.4.1<!--tex4ht:ref: numeric-literals --></a>).<a
id="dx8-25001"></a>
<p class="noindent"> The floating point literal <span
class="cmmi-10">f</span> is equivalent to <span
class="pcrr7t-">fromRational</span> (<span
class="cmmi-10">n</span> <span
class="pcrr7t-">Ratio.%</span> <span
class="cmmi-10">d</span>), where <span
class="pcrr7t-">fromRational</span> is a
method in class <span
class="pcrr7t-">Fractional</span> and <span
class="pcrr7t-">Ratio.%</span> constructs a rational from two integers, as defined in the <span
class="pcrr7t-">Ratio</span>
library.<a
id="dx8-25002"></a> The integers <span
class="cmmi-10">n</span> and <span
class="cmmi-10">d</span> are chosen so that <span
class="cmmi-10">n&#x2215;d</span><span
class="cmmi-10">&#x00A0; </span><span
class="cmr-10">=</span> <span
class="cmmi-10">&#x00A0;f</span>. </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.3 </span> <a
id="x8-260003.3"></a>Curried Applications and Lambda Abstractions</h3>
<a
id="dx8-26001"></a>
<a
id="dx8-26002"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-16" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-16-1g"><col
id="TBL-16-1" /><col
id="TBL-16-2" /><col
id="TBL-16-3" /><col
id="TBL-16-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-16-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-16-1-1"
class="td11"> <span
class="cmmi-10">fexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-16-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-16-1-3"
class="td11"> <span
class="cmr-10">[</span><span
class="cmmi-10">fexp</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;aexp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-16-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>function&#x00A0;application<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-16-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-16-2-1"
class="td11"> <span
class="cmmi-10">lexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-16-2-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-16-2-3"
class="td11"> <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;apat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;apat</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-16-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>lambda&#x00A0;abstraction<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr></table></div></div>
<a
id="dx8-26003"></a>
<a
id="dx8-26004"></a>
<p class="noindent"> <span
class="ptmri7t-">Function application</span><a
id="dx8-26005"></a> is written <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub>. Application associates to the left, so the parentheses may be
omitted in <span
class="pcrr7t-">(f</span><span
class="pcrr7t-">&#x00A0;x)</span><span
class="pcrr7t-">&#x00A0;y</span>. Because <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> could be a data constructor, partial applications of data constructors are
allowed.
<p class="noindent"> <span
class="ptmri7t-">Lambda abstractions </span>are written <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span>, where the <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">i</span></sub> are <span
class="ptmri7t-">patterns</span>. An expression such as <span
class="pcrr7t-">\x:xs-&#x003E;x</span>
is syntactically incorrect; it may legally be written as <span
class="pcrr7t-">\(x:xs)-&#x003E;x</span>.
<p class="noindent"> The set of patterns must be <span
class="ptmri7t-">linear</span><a
id="dx8-26006"></a><a
id="dx8-26007"></a>&#8212;no variable may appear more than once in the set.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-270003.3"></a>Translation:</span>
The following identity holds:
<div class="center"
>
<p class="noindent">
<div class="tabular">
<table id="TBL-17" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-17-1g"><col
id="TBL-17-1" /><col
id="TBL-17-2" /><col
id="TBL-17-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-17-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-17-1-1"
class="td11"> <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-17-1-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-17-1-3"
class="td11"> <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;x</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;x</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="pcrr7t-">&#x00A0;case</span><span
class="pcrr7t-">&#x00A0;(</span><span
class="cmmi-10">x</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;x</span><sub><span
class="cmmi-7">n</span></sub><span
class="pcrr7t-">)</span><span
class="pcrr7t-">&#x00A0;of</span><span
class="pcrr7t-">&#x00A0;(</span><span
class="cmmi-10">p</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmmi-7">n</span></sub><span
class="pcrr7t-">)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span> </td></tr></table>
</div></div>
<p class="noindent"> where the <span
class="cmmi-10">x</span><sub><span
class="cmmi-7">i</span></sub> are new identifiers. </div></div>
</div>
<p class="noindent"> Given this translation combined with the semantics of case expressions and pattern matching described in
Section&#x00A0;<a
href="#x8-610003.17.3">3.17.3<!--tex4ht:ref: case-semantics --></a>, if the pattern fails to match, then the result is <span
class="cmsy-10">&perp;</span>.
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.4 </span> <a
id="x8-280003.4"></a>Operator Applications</h3>
<a
id="dx8-28001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-18" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-18-1g"><col
id="TBL-18-1" /><col
id="TBL-18-2" /><col
id="TBL-18-3" /><col
id="TBL-18-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-18-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-18-1-1"
class="td11"> <span
class="cmmi-10">infixexp</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-18-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-18-1-3"
class="td11"> <span
class="cmmi-10">lexp</span><span
class="cmmi-10">&#x00A0;qop</span><span
class="cmmi-10">&#x00A0;infixexp</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-18-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-18-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-18-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-18-2-3"
class="td11"> <span
class="pcrr7t-">-</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-18-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>prefix&#x00A0;negation<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-18-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-18-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-18-3-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-18-3-3"
class="td11"> <span
class="cmmi-10">lexp</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-18-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-18-4-1"
class="td11"> <span
class="cmmi-10">qop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-18-4-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-18-4-3"
class="td11"> <span
class="cmmi-10">qvarop</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;qconop </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-18-4-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>qualified&#x00A0;operator<span
class="cmr-10">) </span></td>
</tr></table></div></div>
<a
id="dx8-28002"></a>
<a
id="dx8-28003"></a>
<p class="noindent"> The form <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;qop</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub> is the infix application of binary operator<a
id="dx8-28004"></a> <span
class="cmmi-10">qop</span> to expressions <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> and <span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub>.
<p class="noindent"> The special form <span
class="pcrr7t-">-</span><span
class="cmmi-10">e</span> denotes prefix negation<a
id="dx8-28005"></a>, the only prefix operator in Haskell, and is syntax for <span
class="pcrr7t-">negate</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">e</span><span
class="cmr-10">)</span>.<a
id="dx8-28006"></a> The
binary <span
class="pcrr7t-">-</span> operator does not necessarily refer to the definition of <span
class="pcrr7t-">-</span> in the Prelude; it may be rebound by the module
system. However, unary <span
class="pcrr7t-">-</span> will always refer to the <span
class="pcrr7t-">negate</span> function defined in the Prelude. There is no link between
the local meaning of the <span
class="pcrr7t-">-</span> operator and unary negation.
<p class="noindent"> Prefix negation has the same precedence as the infix operator <span
class="pcrr7t-">-</span> defined in the Prelude (see Table&#x00A0;<a
href="haskellch4.html#x10-820061">4.1<!--tex4ht:ref: prelude-fixities --></a>). Because
<span
class="pcrr7t-">e1-e2</span> parses as an infix application of the binary operator <span
class="pcrr7t-">-</span>, one must write <span
class="pcrr7t-">e1(-e2)</span> for the alternative
parsing. Similarly, <span
class="pcrr7t-">(-)</span> is syntax for <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;y</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x-y)</span>, as with any infix operator, and does not denote
<span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;-x)</span>&#8212;one must use <span
class="pcrr7t-">negate</span> for that.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-290003.4"></a>Translation:</span>
The following identities hold:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-19" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-19-1g"><col
id="TBL-19-1" /><col
id="TBL-19-2" /><col
id="TBL-19-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-19-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-19-1-1"
class="td11"> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub> </td><td style="white-space:nowrap; text-align:center;" id="TBL-19-1-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-19-1-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">op</span><span
class="pcrr7t-">)</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-19-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-19-2-1"
class="td11"> <span
class="pcrr7t-">-</span><span
class="cmmi-10">e</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-19-2-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-19-2-3"
class="td11"> <span
class="pcrr7t-">negate</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">e</span><span
class="cmr-10">)</span> </td></tr></table></div></div> </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.5 </span> <a
id="x8-300003.5"></a>Sections</h3>
<a
id="dx8-30001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-20" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-20-1g"><col
id="TBL-20-1" /><col
id="TBL-20-2" /><col
id="TBL-20-3" /><col
id="TBL-20-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-20-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-20-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-20-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-20-1-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">infixexp</span><span
class="cmmi-10">&#x00A0;qop</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-20-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>left&#x00A0;section<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-20-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-20-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-20-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-20-2-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">qop</span><sub><span
class="cmsy-7">&#x27E8;</span><span
class="pcrr7t-">-</span><span
class="cmsy-7">&#x27E9;</span></sub><span
class="cmmi-10">&#x00A0;infixexp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-20-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>right&#x00A0;section<span
class="cmr-10">) </span></td>
</tr></table></div></div>
<a
id="dx8-30002"></a>
<a
id="dx8-30003"></a>
<p class="noindent"> <span
class="ptmri7t-">Sections </span>are written as <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> or <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span>, where <span
class="cmmi-10">op</span> is a binary operator and <span
class="cmmi-10">e</span> is an expression. Sections are a
convenient syntax for partial application of binary operators.
<p class="noindent"> Syntactic precedence rules apply to sections as follows. <span
class="pcrr7t-">(</span><span
class="cmmi-10">op</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">)</span> is legal if and only if <span
class="pcrr7t-">(x</span><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">)</span> parses in the same
way as <span
class="pcrr7t-">(x</span><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">))</span>; and similarly for <span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><span
class="cmmi-10">&#x00A0;op</span><span
class="pcrr7t-">)</span>. For example, <span
class="pcrr7t-">(&#x22C6;a+b)</span> is syntactically invalid, but
<span
class="pcrr7t-">(+a&#x22C6;b)</span> and <span
class="pcrr7t-">(&#x22C6;(a+b))</span> are valid. Because <span
class="pcrr7t-">(+)</span> is left associative, <span
class="pcrr7t-">(a+b+)</span> is syntactically correct, but
<span
class="pcrr7t-">(+a+b)</span> is not; the latter may legally be written as <span
class="pcrr7t-">(+(a+b))</span>. As another example, the expression
<div class="quote">
<div class="verbatim" id="verbatim-7">
&#x00A0;&#x00A0;(let&#x00A0;n&#x00A0;=&#x00A0;10&#x00A0;in&#x00A0;n&#x00A0;+)
</div>
<p class="noindent"></div>
<p class="noindent"> is invalid because, by the let/lambda meta-rule (Section&#x00A0;<a
href="#x8-220003">3<!--tex4ht:ref: expressions --></a>), the expression
<div class="quote">
<div class="verbatim" id="verbatim-8">
&#x00A0;&#x00A0;(let&#x00A0;n&#x00A0;=&#x00A0;10&#x00A0;in&#x00A0;n&#x00A0;+&#x00A0;x)
</div>
<p class="noindent"></div>
<p class="noindent"> parses as
<div class="quote">
<div class="verbatim" id="verbatim-9">
&#x00A0;&#x00A0;(let&#x00A0;n&#x00A0;=&#x00A0;10&#x00A0;in&#x00A0;(n&#x00A0;+&#x00A0;x))
</div>
<p class="noindent"></div>
<p class="noindent"> rather than
<div class="quote">
<div class="verbatim" id="verbatim-10">
&#x00A0;&#x00A0;((let&#x00A0;n&#x00A0;=&#x00A0;10&#x00A0;in&#x00A0;n)&#x00A0;+&#x00A0;x)
</div>
<p class="noindent"></div>
<p class="noindent"> Because <span
class="pcrr7t-">-</span> is treated specially in the grammar, <span
class="pcrr7t-">(-</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="pcrr7t-">)</span> is not a section, but an application of prefix negation,<a
id="dx8-30004"></a> as
described in the preceding section. However, there is a <span
class="pcrr7t-">subtract</span> function defined in the Prelude such that
<span
class="pcrr7t-">(subtract</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="pcrr7t-">)</span> is equivalent to the disallowed section. The expression <span
class="pcrr7t-">(+</span><span
class="pcrr7t-">&#x00A0;(-</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="pcrr7t-">))</span> can serve the same
purpose.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-310003.5"></a>Translation:</span>
The following identities hold:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-21" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-21-1g"><col
id="TBL-21-1" /><col
id="TBL-21-2" /><col
id="TBL-21-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-21-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-21-1-1"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">op</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-21-1-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-21-1-3"
class="td11"> <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;x</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;x</span><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;e</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-21-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-21-2-1"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><span
class="cmmi-10">&#x00A0;op</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-21-2-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-21-2-3"
class="td11"> <span
class="pcrr7t-">\</span><span
class="cmmi-10">&#x00A0;x</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;op</span><span
class="cmmi-10">&#x00A0;x</span> </td></tr></table></div></div>
<p class="noindent"> where <span
class="cmmi-10">op</span> is a binary operator, <span
class="cmmi-10">e</span> is an expression, and <span
class="cmmi-10">x</span> is a variable that does not occur free in
<span
class="cmmi-10">e</span>. </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.6 </span> <a
id="x8-320003.6"></a>Conditionals</h3>
<a
id="dx8-32001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-22" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-22-1g"><col
id="TBL-22-1" /><col
id="TBL-22-2" /><col
id="TBL-22-3" /><col
id="TBL-22-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-22-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-22-1-1"
class="td11"> <span
class="cmmi-10">lexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-22-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-22-1-3"
class="td11"> <span
class="pcrr7t-">if</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">;</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">then</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">;</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">else</span><span
class="cmmi-10">&#x00A0;exp</span> </td>
</tr></table>
</div></div>
<a
id="dx8-32002"></a>
<p class="noindent"> A <span
class="ptmri7t-">conditional expression</span> <a
id="dx8-32003"></a>has the form <span
class="pcrr7t-">if</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">then</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">else</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">3</span></sub> and returns the value of <span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub> if the value of <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> is
<span
class="pcrr7t-">True</span>, <span
class="cmmi-10">e</span><sub><span
class="cmr-7">3</span></sub> if <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> is <span
class="pcrr7t-">False</span>, and <span
class="cmsy-10">&perp;</span> otherwise.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-330003.6"></a>Translation:</span>
The following identity holds:
<div class="center"
>
<p class="noindent">
<div class="tabular">
<table id="TBL-23" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-23-1g"><col
id="TBL-23-1" /><col
id="TBL-23-2" /><col
id="TBL-23-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-23-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-23-1-1"
class="td11"> <span
class="pcrr7t-">if</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">then</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">else</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">3</span></sub> </td><td style="white-space:nowrap; text-align:center;" id="TBL-23-1-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-23-1-3"
class="td11"> <span
class="pcrr7t-">case</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">of</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="pcrr7t-">&#x00A0;True</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="pcrr7t-">&#x00A0;False</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">3</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td></tr></table>
</div></div>
<p class="noindent"> where <span
class="pcrr7t-">True</span> and <span
class="pcrr7t-">False</span> are the two nullary constructors from the type <span
class="pcrr7t-">Bool</span>, as defined in the Prelude. The
type of <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> must be <span
class="pcrr7t-">Bool</span>; <span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub> and <span
class="cmmi-10">e</span><sub><span
class="cmr-7">3</span></sub> must have the same type, which is also the type of the entire conditional
expression. </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.7 </span> <a
id="x8-340003.7"></a>Lists</h3>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-24" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-24-1g"><col
id="TBL-24-1" /><col
id="TBL-24-2" /><col
id="TBL-24-3" /><col
id="TBL-24-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-24-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-1-1"
class="td11"> <span
class="cmmi-10">infixexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-1-3"
class="td11"> <span
class="cmmi-10">exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;qop</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">2</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-2-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-2-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-2-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-24-3-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-3-3"
class="td11"> <span
class="cmmi-10">gcon </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-4-1"
class="td11"> <span
class="cmmi-10">gcon </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-4-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-4-3"
class="td11"> <span
class="pcrr7t-">[]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-24-5-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-5-3"
class="td11"> <span
class="cmmi-10">qcon </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-6-1"
class="td11"> <span
class="cmmi-10">qcon </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-6-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-6-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;gconsym</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-7-1"
class="td11"> <span
class="cmmi-10">qop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-7-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-7-3"
class="td11"> <span
class="cmmi-10">qconop </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-8-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-8-1"
class="td11"> <span
class="cmmi-10">qconop </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-8-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-8-3"
class="td11"> <span
class="cmmi-10">gconsym </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-24-9-"><td style="white-space:nowrap; text-align:left;" id="TBL-24-9-1"
class="td11"> <span
class="cmmi-10">gconsym </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-24-9-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-9-3"
class="td11"> <span
class="pcrr7t-">:</span> </td>
</tr></table></div></div>
<a
id="dx8-34001"></a>
<p class="noindent"> <span
class="ptmri7t-">Lists</span><a
id="dx8-34002"></a> are written <span
class="pcrr7t-">[</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">k</span></sub><span
class="pcrr7t-">]</span>, where <span
class="cmmi-10">k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1</span>. The list constructor is <span
class="pcrr7t-">:</span>, and the empty list is denoted
<span
class="pcrr7t-">[]</span>. Standard operations on lists are given in the Prelude (see Section&#x00A0;<a
href="haskellch6.html#x13-1200006.1.3">6.1.3<!--tex4ht:ref: basic-lists --></a>, and Chapter&#x00A0;<a
href="haskellch9.html#x16-1710009">9<!--tex4ht:ref: stdprelude --></a> notably
Section&#x00A0;<a
href="haskellch9.html#x16-1720009.1">9.1<!--tex4ht:ref: preludelist --></a>).
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-350003.7"></a>Translation:</span>
The following identity holds:
<div class="center"
>
<p class="noindent">
<div class="tabular">
<table id="TBL-25" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-25-1g"><col
id="TBL-25-1" /><col
id="TBL-25-2" /><col
id="TBL-25-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-25-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-25-1-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">k</span></sub><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-25-1-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-25-1-3"
class="td11"> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">:</span><span
class="pcrr7t-">&#x00A0;(</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">:</span><span
class="pcrr7t-">&#x00A0;(</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">:</span><span
class="pcrr7t-">&#x00A0;[])))</span> </td></tr></table>
</div></div>
<p class="noindent"> where <span
class="pcrr7t-">:</span> and <span
class="pcrr7t-">[]</span> are constructors for lists, as defined in the Prelude (see Section&#x00A0;<a
href="haskellch6.html#x13-1200006.1.3">6.1.3<!--tex4ht:ref: basic-lists --></a>). The types of
<span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> through <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">k</span></sub> must all be the same (call it <span
class="cmmi-10">t</span>), and the type of the overall expression is <span
class="pcrr7t-">[</span><span
class="cmmi-10">t</span><span
class="pcrr7t-">]</span> (see
Section&#x00A0;<a
href="haskellch4.html#x10-650004.1.2">4.1.2<!--tex4ht:ref: type-syntax --></a>). </div></div>
</div>
<p class="noindent"> The constructor &#8220;<span
class="pcrr7t-">:</span>&#8221; is reserved solely for list construction; like <span
class="pcrr7t-">[]</span>, it is considered part of the language
syntax, and cannot be hidden or redefined. It is a right-associative operator, with precedence level 5
(Section&#x00A0;<a
href="haskellch4.html#x10-820004.4.2">4.4.2<!--tex4ht:ref: fixity --></a>).
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.8 </span> <a
id="x8-360003.8"></a>Tuples</h3>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-26" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-26-1g"><col
id="TBL-26-1" /><col
id="TBL-26-2" /><col
id="TBL-26-3" /><col
id="TBL-26-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-26-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-26-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-26-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-26-1-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-26-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">2) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-26-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-26-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-26-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-26-2-3"
class="td11"> <span
class="cmmi-10">qcon </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-26-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-26-3-1"
class="td11"> <span
class="cmmi-10">qcon </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-26-3-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-26-3-3"
class="td11"> <span
class="pcrr7t-">(,</span><span
class="cmsy-10">{</span><span
class="pcrr7t-">,</span><span
class="cmsy-10">}</span><span
class="pcrr7t-">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-26-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-26-4-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-26-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-26-5-1"
class="td11"> </td>
</tr></table></div></div>
<a
id="dx8-36001"></a>
<p class="noindent"> <span
class="ptmri7t-">Tuples</span><a
id="dx8-36002"></a> are written <span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">k</span></sub><span
class="pcrr7t-">)</span>, and may be of arbitrary length <span
class="cmmi-10">k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">2</span>. The constructor for an <span
class="cmmi-10">n</span>-tuple is denoted by
<span
class="pcrr7t-">(,</span>&hellip;<span
class="pcrr7t-">,)</span>, where there are <span
class="cmmi-10">n </span><span
class="cmsy-10">&minus; </span><span
class="cmr-10">1</span> commas. Thus <span
class="pcrr7t-">(a,b,c)</span> and <span
class="pcrr7t-">(,,)</span><span
class="pcrr7t-">&#x00A0;a</span><span
class="pcrr7t-">&#x00A0;b</span><span
class="pcrr7t-">&#x00A0;c</span> denote the same value. Standard
operations on tuples are given in the Prelude (see Section&#x00A0;<a
href="haskellch6.html#x13-1210006.1.4">6.1.4<!--tex4ht:ref: basic-tuples --></a> and Chapter&#x00A0;<a
href="haskellch9.html#x16-1710009">9<!--tex4ht:ref: stdprelude --></a>).
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-370003.8"></a>Translation:</span>
<span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">k</span></sub><span
class="pcrr7t-">)</span> for <span
class="cmmi-10">k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">2</span> is an instance of a <span
class="cmmi-10">k</span>-tuple as defined in the Prelude, and requires no translation. If <span
class="cmmi-10">t</span><sub><span
class="cmr-7">1</span></sub>
through <span
class="cmmi-10">t</span><sub><span
class="cmmi-7">k</span></sub> are the types of <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> through <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">k</span></sub>, respectively, then the type of the resulting tuple is <span
class="pcrr7t-">(</span><span
class="cmmi-10">t</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;t</span><sub><span
class="cmmi-7">k</span></sub><span
class="pcrr7t-">)</span> (see
Section&#x00A0;<a
href="haskellch4.html#x10-650004.1.2">4.1.2<!--tex4ht:ref: type-syntax --></a>). </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.9 </span> <a
id="x8-380003.9"></a>Unit Expressions and Parenthesized Expressions</h3>
<a
id="dx8-38001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-27" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-27-1g"><col
id="TBL-27-1" /><col
id="TBL-27-2" /><col
id="TBL-27-3" /><col
id="TBL-27-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-27-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-27-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-27-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-27-1-3"
class="td11"> <span
class="cmmi-10">gcon </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-27-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-27-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-27-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-27-2-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-27-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-27-3-1"
class="td11"> <span
class="cmmi-10">gcon </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-27-3-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-27-3-3"
class="td11"> <span
class="pcrr7t-">()</span> </td>
</tr></table></div></div>
<a
id="dx8-38002"></a>
<p class="noindent"> The form <span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">)</span> is simply a <span
class="ptmri7t-">parenthesized expression</span>, and is equivalent to <span
class="cmmi-10">e</span>. The <span
class="ptmri7t-">unit expression</span> <span
class="pcrr7t-">()</span> has type <span
class="pcrr7t-">()</span><a
id="dx8-38003"></a> (see
Section&#x00A0;<a
href="haskellch4.html#x10-650004.1.2">4.1.2<!--tex4ht:ref: type-syntax --></a>). It is the only member of that type apart from <span
class="cmsy-10">&perp;</span>, and can be thought of as the &#8220;nullary tuple&#8221; (see
Section&#x00A0;<a
href="haskellch6.html#x13-1220006.1.5">6.1.5<!--tex4ht:ref: basic-trivial --></a>).
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="paragraphHead"><a
id="x8-390003.9"></a><span
class="ptmb7t-">Translation:</span></span>
<span
class="pcrr7t-">(</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">)</span> is equivalent to <span
class="cmmi-10">e</span>. </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.10 </span> <a
id="x8-400003.10"></a>Arithmetic Sequences</h3>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-28" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-28-1g"><col
id="TBL-28-1" /><col
id="TBL-28-2" /><col
id="TBL-28-3" /><col
id="TBL-28-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-28-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-28-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-28-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-28-1-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;exp</span><sub><span
class="cmr-7">2</span></sub><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">..</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="cmmi-10">exp</span><sub><span
class="cmr-7">3</span></sub><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td>
</tr></table>
</div></div>
<a
id="dx8-40001"></a>
<p class="noindent">
<p class="noindent"> The <span
class="ptmri7t-">arithmetic sequence</span><a
id="dx8-40002"></a> <span
class="pcrr7t-">[</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">2</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">..</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">3</span></sub><span
class="pcrr7t-">]</span> denotes a list of values of type <span
class="cmmi-10">t</span>, where each of the <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">i</span></sub> has type <span
class="cmmi-10">t</span>, and <span
class="cmmi-10">t</span> is
an instance of class <span
class="pcrr7t-">Enum</span>.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="paragraphHead"><a
id="x8-410003.10"></a><span
class="ptmb7t-">Translation:</span></span>
Arithmetic sequences satisfy these identities:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-29" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-29-1g"><col
id="TBL-29-1" /><col
id="TBL-29-2" /><col
id="TBL-29-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-29-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-29-1-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">..</span><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-29-1-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-29-1-3"
class="td11"> <span
class="pcrr7t-">enumFrom</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-29-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-29-2-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub><span
class="pcrr7t-">..</span><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-29-2-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-29-2-3"
class="td11"> <span
class="pcrr7t-">enumFromThen</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-29-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-29-3-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">..</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">3</span></sub><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-29-3-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-29-3-3"
class="td11"> <span
class="pcrr7t-">enumFromTo</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">3</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-29-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-29-4-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub><span
class="pcrr7t-">..</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">3</span></sub><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-29-4-2"
class="td11"> <span
class="cmr-10">=</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-29-4-3"
class="td11"> <span
class="pcrr7t-">enumFromThenTo</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">2</span></sub> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">3</span></sub> </td></tr></table>
</div></div>
<p class="noindent"> where <span
class="pcrr7t-">enumFrom</span>, <span
class="pcrr7t-">enumFromThen</span>, <span
class="pcrr7t-">enumFromTo</span>, and <span
class="pcrr7t-">enumFromThenTo</span> are class methods in the class
<span
class="pcrr7t-">Enum</span> as defined in the Prelude (see Figure&#x00A0;<a
href="haskellch6.html#x13-1270011">6.1<!--tex4ht:ref: standard-classes --></a>). </div></div>
</div>
<p class="noindent"> The semantics of arithmetic sequences therefore depends entirely on the instance declaration for the type <span
class="cmmi-10">t</span>. See
Section&#x00A0;<a
href="haskellch6.html#x13-1310006.3.4">6.3.4<!--tex4ht:ref: enum-class --></a> for more details of which <span
class="pcrr7t-">Prelude</span> types are in <span
class="pcrr7t-">Enum</span> and their semantics.
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.11 </span> <a
id="x8-420003.11"></a>List Comprehensions</h3>
<a
id="dx8-42001"></a>
<a
id="dx8-42002"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-30" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-30-1g"><col
id="TBL-30-1" /><col
id="TBL-30-2" /><col
id="TBL-30-3" /><col
id="TBL-30-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-30-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-30-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-30-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-30-1-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;qual</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;qual</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-30-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>list&#x00A0;comprehension<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-30-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-30-2-1"
class="td11"> <span
class="cmmi-10">qual </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-30-2-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-30-2-3"
class="td11"> <span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">&#x003C;-</span><span
class="cmmi-10">&#x00A0;exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-30-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>generator<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-30-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-30-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-30-3-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-30-3-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-30-3-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>local&#x00A0;declaration<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-30-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-30-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-30-4-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-30-4-3"
class="td11"> <span
class="cmmi-10">exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-30-4-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>boolean&#x00A0;guard<span
class="cmr-10">) </span></td>
</tr></table></div></div>
<a
id="dx8-42003"></a>
<a
id="dx8-42004"></a>
<p class="noindent"> A <span
class="ptmri7t-">list comprehension </span>has the form <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;q</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;q</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span><span
class="cmmi-10">,</span><span
class="cmmi-10">n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1</span><span
class="cmmi-10">,</span> where the <span
class="cmmi-10">q</span><sub><span
class="cmmi-7">i</span></sub> qualifiers<a
id="dx8-42005"></a> are either
<ul class="itemize1">
<li class="itemize"><span
class="ptmri7t-">generators</span><a
id="dx8-42006"></a> of the form <span
class="cmmi-10">p</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">&#x003C;-</span><span
class="cmmi-10">&#x00A0;e</span>, where <span
class="cmmi-10">p</span> is a pattern (see Section&#x00A0;<a
href="#x8-580003.17">3.17<!--tex4ht:ref: pattern-matching --></a>) of type <span
class="cmmi-10">t</span> and <span
class="cmmi-10">e</span> is an expression
of type <span
class="pcrr7t-">[</span><span
class="cmmi-10">t</span><span
class="pcrr7t-">]</span>
</li>
<li class="itemize"><span
class="ptmri7t-">local bindings </span>that provide new definitions for use in the generated expression <span
class="cmmi-10">e</span> or subsequent boolean
guards and generators
</li>
<li class="itemize"><span
class="ptmri7t-">boolean guards</span>,<a
id="dx8-42007"></a> which are arbitrary expressions of type <span
class="pcrr7t-">Bool</span>.</li></ul>
<p class="noindent"> Such a list comprehension returns the list of elements produced by evaluating <span
class="cmmi-10">e</span> in the successive environments
created by the nested, depth-first evaluation of the generators in the qualifier list. Binding of variables occurs
according to the normal pattern matching rules (see Section&#x00A0;<a
href="#x8-580003.17">3.17<!--tex4ht:ref: pattern-matching --></a>), and if a match fails then that element of the list is
simply skipped over. Thus:
<div class="quote">
<div class="verbatim" id="verbatim-11">
[&#x00A0;x&#x00A0;|&#x00A0;&#x00A0;xs&#x00A0;&#x00A0;&#x00A0;&#x003C;-&#x00A0;[&#x00A0;[(1,2),(3,4)],&#x00A0;[(5,4),(3,2)]&#x00A0;],
&#x00A0;<br />&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;(3,x)&#x00A0;&#x003C;-&#x00A0;xs&#x00A0;]
</div>
<p class="noindent"></div>
<p class="noindent"> yields the list <span
class="pcrr7t-">[4,2]</span>. If a qualifier is a boolean guard, it must evaluate to <span
class="pcrr7t-">True</span> for the previous pattern
match to succeed. As usual, bindings in list comprehensions can shadow those in outer scopes; for
example:
<div class="array"> <table id="TBL-31" class="array"
cellpadding="0" cellspacing="0"
><colgroup id="TBL-31-1g"><col
id="TBL-31-1" /><col
id="TBL-31-2" /><col
id="TBL-31-3" /></colgroup><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;&#x003C;-</span><span
class="pcrr7t-">&#x00A0;x,</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;&#x003C;-</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;]</span> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="cmr-10">= </span></div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;z</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;y</span><span
class="pcrr7t-">&#x00A0;&#x003C;-</span><span
class="pcrr7t-">&#x00A0;x,</span><span
class="pcrr7t-">&#x00A0;z</span><span
class="pcrr7t-">&#x00A0;&#x003C;-</span><span
class="pcrr7t-">&#x00A0;y]</span> </div></td>
</tr><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td>
</tr></table> </div>
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"><span class="paragraphHead"><a
id="x8-430003.11"></a><span
class="ptmb7t-">Translation:</span></span>
List comprehensions satisfy these identities, which may be used as a translation into the kernel:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-32" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-32-1g"><col
id="TBL-32-1" /><col
id="TBL-32-2" /><col
id="TBL-32-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-32-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-1-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;True</span><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-1-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-32-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-2-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">q</span><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-2-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-2-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;q</span><span
class="pcrr7t-">,</span><span
class="pcrr7t-">&#x00A0;True</span><span
class="pcrr7t-">&#x00A0;]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-32-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-3-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">b</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;Q</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-3-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-3-3"
class="td11"> <span
class="pcrr7t-">if</span><span
class="cmmi-10">&#x00A0;b</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">then</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">Q</span><span
class="pcrr7t-">&#x00A0;]</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">else</span><span
class="pcrr7t-">&#x00A0;[]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-32-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-4-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">&#x003C;-</span><span
class="cmmi-10">&#x00A0;l</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;Q</span><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-4-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-4-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;ok</span><span
class="cmmi-10">&#x00A0;p</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">Q</span><span
class="pcrr7t-">&#x00A0;]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-32-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-5-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-5-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;ok</span><span
class="pcrr7t-">&#x00A0;_</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;[]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-32-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-6-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-6-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-6-3"
class="td11"> <span
class="pcrr7t-">in</span><span
class="pcrr7t-">&#x00A0;concatMap</span><span
class="pcrr7t-">&#x00A0;ok</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;l</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-32-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-32-7-1"
class="td11"> <span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;let</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;Q</span><span
class="pcrr7t-">&#x00A0;]</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-32-7-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-32-7-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">in</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">[</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;e</span><span
class="pcrr7t-">&#x00A0;|</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">Q</span><span
class="pcrr7t-">&#x00A0;]</span> </td></tr></table>
</div></div>
<p class="noindent"> where <span
class="cmmi-10">e</span> ranges over expressions, <span
class="cmmi-10">p</span> over patterns, <span
class="cmmi-10">l</span> over list-valued expressions, <span
class="cmmi-10">b</span> over boolean expressions,
<span
class="cmmi-10">decls</span> over declaration lists, <span
class="cmmi-10">q</span> over qualifiers, and <span
class="cmmi-10">Q</span> over sequences of qualifiers. <span
class="pcrr7t-">ok</span> is a fresh variable. The
function <span
class="pcrr7t-">concatMap</span>, and boolean value <span
class="pcrr7t-">True</span>, are defined in the Prelude. </div></div>
</div>
<p class="noindent"> As indicated by the translation of list comprehensions, variables bound by <span
class="pcrr7t-">let</span> have fully polymorphic types while
those defined by <span
class="pcrr7t-">&#x003C;-</span> are lambda bound and are thus monomorphic (see Section <a
href="haskellch4.html#x10-920004.5.4">4.5.4<!--tex4ht:ref: monomorphism --></a>).
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.12 </span> <a
id="x8-440003.12"></a>Let Expressions</h3>
<a
id="dx8-44001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-33" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-33-1g"><col
id="TBL-33-1" /><col
id="TBL-33-2" /><col
id="TBL-33-3" /><col
id="TBL-33-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-33-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-33-1-1"
class="td11"> <span
class="cmmi-10">lexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-33-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-33-1-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">in</span><span
class="cmmi-10">&#x00A0;exp </span></td>
</tr></table>
</div></div>
<a
id="dx8-44002"></a>
<a
id="dx8-44003"></a>
<p class="noindent"> <span
class="ptmri7t-">Let expressions </span>have the general form <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">&#x00A0;d</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;d</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="cmmi-10">&#x00A0;e</span>, and introduce a nested, lexically-scoped,
mutually-recursive list of declarations (<span
class="pcrr7t-">let</span> is often called <span
class="pcrr7t-">letrec</span> in other languages). The scope of the
declarations is the expression <span
class="cmmi-10">e</span> and the right hand side of the declarations. Declarations are described
in Chapter&#x00A0;<a
href="haskellch4.html#x10-620004">4<!--tex4ht:ref: declarations --></a>. Pattern bindings are matched lazily; an implicit <span
class="pcrr7t-">~</span> makes these patterns irrefutable.<a
id="dx8-44004"></a> For
example,
<div class="tabular"> <table id="TBL-34" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-34-1g"><col
id="TBL-34-1" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-34-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-34-1-1"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;(x,y)</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;undefined</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span> </td>
</tr></table>
</div>
<p class="noindent"> does not cause an execution-time error until <span
class="pcrr7t-">x</span> or <span
class="pcrr7t-">y</span> is evaluated.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-450003.12"></a>Translation:</span>
The dynamic semantics of the expression <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">&#x00A0;d</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;d</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmr-7">0</span></sub> are captured by this
translation: After removing all type signatures, each declaration <span
class="cmmi-10">d</span><sub><span
class="cmmi-7">i</span></sub> is translated into an equation of
the form <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">i</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">i</span></sub>, where <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">i</span></sub> and <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">i</span></sub> are patterns and expressions respectively, using the translation
in Section&#x00A0;<a
href="haskellch4.html#x10-830004.4.3">4.4.3<!--tex4ht:ref: function-bindings --></a>. Once done, these identities hold, which may be used as a translation into the
kernel:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-35" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-35-1g"><col
id="TBL-35-1" /><col
id="TBL-35-2" /><col
id="TBL-35-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-35-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-35-1-1"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">p</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">=</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">;</span><span
class="pcrr7t-">&#x00A0;</span> ... <span
class="pcrr7t-">;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><sub><span
class="cmmi-7">n</span></sub><span
class="pcrr7t-">=</span><span
class="cmmi-10">e</span><sub><span
class="cmmi-7">n</span></sub><span
class="pcrr7t-">}</span><span
class="pcrr7t-">&#x00A0;in</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">0</span></sub> </td><td style="white-space:nowrap; text-align:center;" id="TBL-35-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-35-1-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;(~</span><span
class="cmmi-10">p</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span> ... <span
class="pcrr7t-">,~</span><span
class="cmmi-10">p</span><sub><span
class="cmmi-7">n</span></sub><span
class="pcrr7t-">)</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;(</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">,</span> ... <span
class="pcrr7t-">,</span><span
class="cmmi-10">e</span><sub><span
class="cmmi-7">n</span></sub><span
class="pcrr7t-">)</span><span
class="pcrr7t-">&#x00A0;in</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">0</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-35-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-35-2-1"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> <span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">0</span></sub> </td><td style="white-space:nowrap; text-align:center;" id="TBL-35-2-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-35-2-3"
class="td11"> <span
class="pcrr7t-">case</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">&#x00A0;of</span><span
class="pcrr7t-">&#x00A0;~</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">0</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-35-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-35-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-35-3-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-35-3-3"
class="td11"> where no variable in <span
class="cmmi-10">p</span> appears free in <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-35-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-35-4-1"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> <span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">0</span></sub> </td><td style="white-space:nowrap; text-align:center;" id="TBL-35-4-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-35-4-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;fix</span><span
class="pcrr7t-">&#x00A0;(</span><span
class="pcrr7t-">&#x00A0;\</span><span
class="pcrr7t-">&#x00A0;~</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub><span
class="pcrr7t-">)</span><span
class="pcrr7t-">&#x00A0;in</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">0</span></sub> </td></tr></table>
</div></div>
<p class="noindent"> where <span
class="pcrr7t-">fix</span> is the least fixpoint operator. Note the use of the irrefutable patterns <span
class="pcrr7t-">~</span><span
class="cmmi-10">p</span>. This translation does
not preserve the static semantics because the use of <span
class="pcrr7t-">case</span> precludes a fully polymorphic typing
of the bound variables. The static semantics of the bindings in a <span
class="pcrr7t-">let</span> expression are described in
Section&#x00A0;<a
href="haskellch4.html#x10-830004.4.3">4.4.3<!--tex4ht:ref: pattern-bindings --></a>. </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.13 </span> <a
id="x8-460003.13"></a>Case Expressions</h3>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-36" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-36-1g"><col
id="TBL-36-1" /><col
id="TBL-36-2" /><col
id="TBL-36-3" /><col
id="TBL-36-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-36-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-1-1"
class="td11"> <span
class="cmmi-10">lexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-36-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-1-3"
class="td11"> <span
class="pcrr7t-">case</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">of</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;alts</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-2-1"
class="td11"> <span
class="cmmi-10">alts </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-36-2-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-2-3"
class="td11"> <span
class="cmmi-10">alt</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;alt</span><sub><span
class="cmmi-7">n</span></sub> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-3-1"
class="td11"> <span
class="cmmi-10">alt </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-36-3-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-3-3"
class="td11"> <span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">where</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="cmr-10">] </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-36-4-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-4-3"
class="td11"> <span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;gdpat</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">where</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="cmr-10">] </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-36-5-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-5-3"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-5-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">empty</span><span
class="cmmi-10">&#x00A0;alternative</span><span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-6-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-36-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-7-1"
class="td11"></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-8-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-8-1"
class="td11"> <span
class="cmmi-10">gdpat </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-36-8-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-8-3"
class="td11"> <span
class="cmmi-10">guards</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="cmmi-10">&#x00A0;gdpat</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">]</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-9-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-9-1"
class="td11"> <span
class="cmmi-10">guards</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-36-9-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-9-3"
class="td11"> <span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;guard</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;guard</span><sub><span
class="cmmi-7">n</span></sub> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-9-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-10-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-10-1"
class="td11"> <span
class="cmmi-10">guard</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-36-10-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-10-3"
class="td11"> <span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">&#x003C;-</span><span
class="cmmi-10">&#x00A0;infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-10-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>pattern&#x00A0;guard<span
class="cmr-10">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-11-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-11-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-36-11-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-11-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-11-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>local&#x00A0;declaration<span
class="cmr-10">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-36-12-"><td style="white-space:nowrap; text-align:left;" id="TBL-36-12-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-36-12-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-12-3"
class="td11"> <span
class="cmmi-10">infixexp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-36-12-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>boolean&#x00A0;guard<span
class="cmr-10">) </span></td>
</tr></table></div></div>
<a
id="dx8-46001"></a>
<a
id="dx8-46002"></a>
<a
id="dx8-46003"></a>
<a
id="dx8-46004"></a>
<a
id="dx8-46005"></a>
<a
id="dx8-46006"></a>
<p class="noindent"> A <span
class="ptmri7t-">case expression</span><a
id="dx8-46007"></a> has the general form
<span
class="pcrr7t-">case</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">of</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;match</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;match</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span>
where each <span
class="cmmi-10">match</span><sub><span
class="cmmi-7">i</span></sub> is of the general form
<div class="array"> <table id="TBL-37" class="array"
cellpadding="0" cellspacing="0"
><colgroup id="TBL-37-1g"><col
id="TBL-37-1" /><col
id="TBL-37-2" /><col
id="TBL-37-3" /></colgroup><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">gs</span><sub><span
class="cmmi-7">i</span><span
class="cmr-7">1</span></sub> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">i</span><span
class="cmr-7">1</span></sub> </div></td>
</tr><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="cmmi-10">&hellip;</span> </div></td>
</tr><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">|</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">gs</span><sub><span
class="cmmi-7">im</span><sub><span
class="cmmi-5">i</span></sub></sub> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;e</span><sub><span
class="cmmi-7">im</span><sub><span
class="cmmi-5">i</span></sub></sub> </div></td>
</tr><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td><td colspan="2" style="white-space:nowrap; text-align:left;"
><div class="td11"> <div class="multicolumn" style="white-space:nowrap; text-align:left;"><span
class="pcrr7t-">where</span><span
class="cmmi-10">&#x00A0;decls</span><sub><span
class="cmmi-7">i</span></sub></div>
</div></td></tr></table> </div>
(Notice that in the syntax rule for <span
class="cmmi-10">guards</span>, the &#8220;<span
class="pcrr7t-">|</span>&#8221; is a terminal symbol, not the syntactic metasymbol for
alternation.) Each alternative <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">i</span></sub><span
class="cmmi-10">&#x00A0;match</span><sub><span
class="cmmi-7">i</span></sub> consists of a pattern<a
id="dx8-46008"></a> <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">i</span></sub> and its matches, <span
class="cmmi-10">match</span><sub><span
class="cmmi-7">i</span></sub>. Each match in turn consists
of a sequence of pairs of guards<a
id="dx8-46009"></a> <span
class="cmmi-10">gs</span><sub><span
class="cmmi-7">ij</span></sub> and bodies <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">ij</span></sub> (expressions), followed by optional bindings (<span
class="cmmi-10">decls</span><sub><span
class="cmmi-7">i</span></sub>) that scope
over all of the guards and expressions of the alternative.
<a
id="dx8-46010"></a>
<a
id="dx8-46011"></a>
<p class="noindent"> A <span
class="ptmri7t-">guard</span><a
id="dx8-46012"></a> has one of the following forms:
<ul class="itemize1">
<li class="itemize"><span
class="ptmri7t-">pattern guards</span><a
id="dx8-46013"></a> are of the form <span
class="cmmi-10">p</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">&#x003C;-</span><span
class="cmmi-10">&#x00A0;e</span>, where <span
class="cmmi-10">p</span> is a pattern
(see Section&#x00A0;<a
href="#x8-580003.17">3.17<!--tex4ht:ref: pattern-matching --></a>) of type <span
class="cmmi-10">t</span> and <span
class="cmmi-10">e</span> is an expression type
<span
class="cmmi-10">t</span><span class="footnote-mark"><a
href="haskell9.html#fn1x5"><sup class="textsuperscript">1</sup></a></span><a
id="x8-46014f1"></a>.
They succeed if the expression <span
class="cmmi-10">e</span> matches the pattern <span
class="cmmi-10">p</span>, and introduce the bindings of the pattern to the
environment.
</li>
<li class="itemize"><span
class="ptmri7t-">local bindings </span>are of the form <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls</span>. They always succeed, and they introduce the names defined
in <span
class="cmmi-10">decls</span> to the environment.
</li>
<li class="itemize"><span
class="ptmri7t-">boolean guards</span><a
id="dx8-46015"></a> are arbitrary expressions of type <span
class="pcrr7t-">Bool</span>. They succeed if the expression evaluates to
<span
class="pcrr7t-">True</span>, and they do not introduce new names to the environment. A boolean guard, <span
class="cmmi-10">g</span>, is semantically
equivalent to the pattern guard <span
class="pcrr7t-">True</span><span
class="pcrr7t-">&#x00A0;&#x003C;-</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">g</span>.</li></ul>
<p class="noindent"> An alternative of the form
<span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">where</span><span
class="cmmi-10">&#x00A0;decls</span>
is treated as shorthand for:
<div class="array"> <table id="TBL-38" class="array"
cellpadding="0" cellspacing="0"
><colgroup id="TBL-38-1g"><col
id="TBL-38-1" /><col
id="TBL-38-2" /><col
id="TBL-38-3" /></colgroup><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">|</span><span
class="pcrr7t-">&#x00A0;True</span> </div></td><td style="white-space:nowrap; text-align:left;"
><div class="td11"> <span
class="pcrr7t-">-&#x003E;</span><span
class="cmmi-10">&#x00A0;exp</span> </div></td>
</tr><tr
style="vertical-align:baseline;"><td style="white-space:nowrap; text-align:left;"
><div class="td11"> </div></td><td colspan="2" style="white-space:nowrap; text-align:left;"
><div class="td11"> <div class="multicolumn" style="white-space:nowrap; text-align:left;"><span
class="pcrr7t-">where</span><span
class="cmmi-10">&#x00A0;decls</span></div>
</div></td></tr></table> </div>
<p class="noindent"> A case expression must have at least one alternative and each alternative must have at least one body. Each body
must have the same type, and the type of the whole expression is that type.
<p class="noindent"> A case expression is evaluated by pattern matching the expression <span
class="cmmi-10">e</span> against the individual alternatives. The
alternatives are tried sequentially, from top to bottom. If <span
class="cmmi-10">e</span> matches the pattern of an alternative, then the guarded
expressions for that alternative are tried sequentially from top to bottom in the environment of the case expression
extended first by the bindings created during the matching of the pattern, and then by the <span
class="cmmi-10">decls</span><sub><span
class="cmmi-7">i</span></sub> in the <span
class="pcrr7t-">where</span> clause
associated with that alternative.
<p class="noindent"> For each guarded expression, the comma-separated guards are tried sequentially from left to right. If all of
them succeed, then the corresponding expression is evaluated in the environment extended with the
bindings introduced by the guards. That is, the bindings that are introduced by a guard (either by using a
let clause or a pattern guard) are in scope in the following guards and the corresponding expression.
If any of the guards fail, then this guarded expression fails and the next guarded expression is tried.
<p class="noindent"> If none of the guarded expressions for a given alternative succeed, then matching continues with the next alternative.
If no alternative succeeds, then the result is <span
class="cmsy-10">&perp;</span>. Pattern matching is described in Section&#x00A0;<a
href="#x8-580003.17">3.17<!--tex4ht:ref: pattern-matching --></a>, with the formal
semantics of case expressions in Section&#x00A0;<a
href="#x8-610003.17.3">3.17.3<!--tex4ht:ref: case-semantics --></a>.
<p class="noindent"> <span
class="ptmri7t-">A note about parsing. </span>The expression
<div class="quote">
<div class="verbatim" id="verbatim-12">
&#x00A0;&#x00A0;case&#x00A0;x&#x00A0;of&#x00A0;{&#x00A0;(a,_)&#x00A0;|&#x00A0;let&#x00A0;b&#x00A0;=&#x00A0;not&#x00A0;a&#x00A0;in&#x00A0;b&#x00A0;::&#x00A0;Bool&#x00A0;-&#x003E;&#x00A0;a&#x00A0;}
</div>
<p class="noindent"></div>
<p class="noindent"> is tricky to parse correctly. It has a single unambiguous parse, namely
<div class="quote">
<div class="verbatim" id="verbatim-13">
&#x00A0;&#x00A0;case&#x00A0;x&#x00A0;of&#x00A0;{&#x00A0;(a,_)&#x00A0;|&#x00A0;(let&#x00A0;b&#x00A0;=&#x00A0;not&#x00A0;a&#x00A0;in&#x00A0;b&#x00A0;::&#x00A0;Bool)&#x00A0;-&#x003E;&#x00A0;a&#x00A0;}
</div>
<p class="noindent"></div>
<p class="noindent"> However, the phrase <span
class="pcrr7t-">Bool</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;a</span> is syntactically valid as a type, and parsers with limited lookahead may
incorrectly commit to this choice, and hence reject the program. Programmers are advised, therefore, to
avoid guards that end with a type signature &#8212; indeed that is why a <span
class="cmmi-10">guard</span> contains an <span
class="cmmi-10">infixexp</span> not an
<span
class="cmmi-10">exp</span>.
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.14 </span> <a
id="x8-470003.14"></a>Do Expressions</h3>
<a
id="dx8-47001"></a>
<a
id="dx8-47002"></a>
<a
id="dx8-47003"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-39" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-39-1g"><col
id="TBL-39-1" /><col
id="TBL-39-2" /><col
id="TBL-39-3" /><col
id="TBL-39-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-39-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-39-1-1"
class="td11"> <span
class="cmmi-10">lexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-39-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-1-3"
class="td11"> <span
class="pcrr7t-">do</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;stmts</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>do&#x00A0;expression<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-39-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-39-2-1"
class="td11"> <span
class="cmmi-10">stmts </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-39-2-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-2-3"
class="td11"> <span
class="cmmi-10">stmt</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;stmt</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="pcrr7t-">;</span><span
class="cmr-10">] </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-39-2-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">0) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-39-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-39-3-1"
class="td11"> <span
class="cmmi-10">stmt </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-39-3-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-3-3"
class="td11"> <span
class="cmmi-10">exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-39-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-39-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-39-4-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-4-3"
class="td11"> <span
class="cmmi-10">pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">&#x003C;-</span><span
class="cmmi-10">&#x00A0;exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-39-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-39-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-39-5-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-5-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="cmmi-10">&#x00A0;decls</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-39-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-39-6-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-39-6-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-6-3"
class="td11"> <span
class="pcrr7t-">;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-6-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">empty</span><span
class="cmmi-10">&#x00A0;statement</span><span
class="cmr-10">) </span></td>
</tr></table></div></div>
<a
id="dx8-47004"></a>
<a
id="dx8-47005"></a>
<a
id="dx8-47006"></a>
<p class="noindent"> A <span
class="ptmri7t-">do expression </span>provides a more conventional syntax for monadic programming. It allows an expression such as
<div class="quote">
<div class="verbatim" id="verbatim-14">
&#x00A0;&#x00A0;putStr&#x00A0;"x:&#x00A0;"&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x003E;&#x003E;
&#x00A0;<br />&#x00A0;&#x00A0;getLine&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x003E;&#x003E;=&#x00A0;\l&#x00A0;-&#x003E;
&#x00A0;<br />&#x00A0;&#x00A0;return&#x00A0;(words&#x00A0;l)
</div>
<p class="noindent"></div>
<p class="noindent"> to be written in a more traditional way as:
<div class="quote">
<div class="verbatim" id="verbatim-15">
&#x00A0;&#x00A0;do&#x00A0;putStr&#x00A0;"x:&#x00A0;"
&#x00A0;<br />&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;l&#x00A0;&#x003C;-&#x00A0;getLine
&#x00A0;<br />&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;return&#x00A0;(words&#x00A0;l)
</div>
<p class="noindent"></div>
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"><span class="likeparagraphHead"><a
id="x8-480003.14"></a>Translation:</span>
Do expressions satisfy these identities, which may be used as a translation into the kernel, after eliminating
empty <span
class="cmmi-10">stmts</span>:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-40" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-40-1g"><col
id="TBL-40-1" /><col
id="TBL-40-2" /><col
id="TBL-40-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-40-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-1-1"
class="td11"> <span
class="pcrr7t-">do</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-40-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-40-1-3"
class="td11"> <span
class="cmmi-10">e</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-40-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-2-1"
class="td11"> <span
class="pcrr7t-">do</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">;</span><span
class="cmmi-10">stmts</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-40-2-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-40-2-3"
class="td11"> <span
class="cmmi-10">e</span> <span
class="pcrr7t-">&#x003E;&#x003E;</span><span
class="pcrr7t-">&#x00A0;do</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">stmts</span><span
class="pcrr7t-">}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-40-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-3-1"
class="td11"> <span
class="pcrr7t-">do</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;&#x003C;-</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">stmts</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-40-3-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-40-3-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;ok</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">p</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;do</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">stmts</span><span
class="pcrr7t-">}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-40-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-40-4-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-40-4-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;ok</span><span
class="pcrr7t-">&#x00A0;_</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;fail</span><span
class="pcrr7t-">&#x00A0;"..."</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-40-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-40-5-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-40-5-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">e</span><span
class="pcrr7t-">&#x00A0;&#x003E;&#x003E;=</span><span
class="pcrr7t-">&#x00A0;ok</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-40-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-6-1"
class="td11"> <span
class="pcrr7t-">do</span><span
class="pcrr7t-">&#x00A0;{let</span> <span
class="cmmi-10">decls</span><span
class="pcrr7t-">;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">stmts</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-40-6-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-40-6-3"
class="td11"> <span
class="pcrr7t-">let</span> <span
class="cmmi-10">decls</span> <span
class="pcrr7t-">in</span><span
class="pcrr7t-">&#x00A0;do</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">stmts</span><span
class="pcrr7t-">}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-40-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-40-7-1"
class="td11"> </td></tr></table></div></div>
<p class="noindent"> The ellipsis <span
class="pcrr7t-">"..."</span> stands for a compiler-generated error message, passed to <span
class="pcrr7t-">fail</span>, preferably giving some
indication of the location of the pattern-match failure; the functions <span
class="pcrr7t-">&#x003E;&#x003E;</span>, <span
class="pcrr7t-">&#x003E;&#x003E;=</span>, and <span
class="pcrr7t-">fail</span> are operations in the
class <span
class="pcrr7t-">Monad</span>, as defined in the Prelude<a
id="dx8-48001"></a>; and <span
class="pcrr7t-">ok</span> is a fresh identifier. </div></div>
</div>
<p class="noindent"> As indicated by the translation of <span
class="pcrr7t-">do</span>, variables bound by <span
class="pcrr7t-">let</span> have fully polymorphic types while those defined by
<span
class="pcrr7t-">&#x003C;-</span> are lambda bound and are thus monomorphic.
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.15 </span> <a
id="x8-490003.15"></a>Datatypes with Field Labels</h3>
<a
id="dx8-49001"></a>
<a
id="dx8-49002"></a>
<a
id="dx8-49003"></a>
<p class="noindent"> A datatype declaration may optionally define field labels (see Section&#x00A0;<a
href="haskellch4.html#x10-690004.2.1">4.2.1<!--tex4ht:ref: datatype-decls --></a>). These field labels can be used to
construct, select from, and update fields in a manner that is independent of the overall structure of the
datatype.
<p class="noindent"> Different datatypes cannot share common field labels in the same scope. A field label can be used
at most once in a constructor. Within a datatype, however, a field label can be used in more than one
constructor provided the field has the same typing in all constructors. To illustrate the last point, consider:
<div class="quote">
<div class="verbatim" id="verbatim-16">
&#x00A0;&#x00A0;data&#x00A0;S&#x00A0;=&#x00A0;S1&#x00A0;{&#x00A0;x&#x00A0;::&#x00A0;Int&#x00A0;}&#x00A0;|&#x00A0;S2&#x00A0;{&#x00A0;x&#x00A0;::&#x00A0;Int&#x00A0;}&#x00A0;&#x00A0;&#x00A0;--&#x00A0;OK
&#x00A0;<br />&#x00A0;&#x00A0;data&#x00A0;T&#x00A0;=&#x00A0;T1&#x00A0;{&#x00A0;y&#x00A0;::&#x00A0;Int&#x00A0;}&#x00A0;|&#x00A0;T2&#x00A0;{&#x00A0;y&#x00A0;::&#x00A0;Bool&#x00A0;}&#x00A0;&#x00A0;--&#x00A0;BAD
</div>
<p class="noindent"></div>
<p class="noindent"> Here <span
class="pcrr7t-">S</span> is legal but <span
class="pcrr7t-">T</span> is not, because <span
class="pcrr7t-">y</span> is given inconsistent typings in the latter.
<p class="noindent">
<h4 class="subsectionHead"><span class="titlemark">3.15.1 </span> <a
id="x8-500003.15.1"></a>Field Selection</h4>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-41" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-41-1g"><col
id="TBL-41-1" /><col
id="TBL-41-2" /><col
id="TBL-41-3" /><col
id="TBL-41-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-41-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-41-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-41-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-41-1-3"
class="td11"> <span
class="cmmi-10">qvar </span></td>
</tr></table>
</div></div>
<a
id="dx8-50001"></a>
<p class="noindent"> Field labels are used as selector functions. When used as a variable, a field label serves as a function that extracts the
field from an object. Selectors are top level bindings and so they may be shadowed by local variables but cannot
conflict with other top level bindings of the same name. This shadowing only affects selector functions; in record
construction (Section&#x00A0;<a
href="#x8-520003.15.2">3.15.2<!--tex4ht:ref: record-construction --></a>) and update (Section&#x00A0;<a
href="#x8-540003.15.3">3.15.3<!--tex4ht:ref: record-update --></a>), field labels cannot be confused with ordinary
variables.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-510003.15.1"></a>Translation:</span>
A field label <span
class="cmmi-10">f</span> introduces a selector function defined as:
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-42" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-42-1g"><col
id="TBL-42-1" /><col
id="TBL-42-2" /><col
id="TBL-42-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-42-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-42-1-1"
class="td11"> <span
class="cmmi-10">f</span><span
class="pcrr7t-">&#x00A0;x</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-42-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-42-1-3"
class="td11"> <span
class="pcrr7t-">case</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;of</span><span
class="pcrr7t-">&#x00A0;{</span> <span
class="cmmi-10">C</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmr-7">11</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmr-7">1</span><span
class="cmmi-7">k</span></sub> <span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;</span> <span
class="cmmi-10">e</span><sub><span
class="cmr-7">1</span></sub> <span
class="pcrr7t-">;</span><span
class="cmmi-10">&hellip;</span> <span
class="pcrr7t-">;</span> <span
class="cmmi-10">C</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmmi-7">n</span><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;p</span><sub><span
class="cmmi-7">nk</span></sub> <span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;</span> <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">n</span></sub> <span
class="pcrr7t-">}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-42-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-42-2-1"
class="td11"> </td></tr></table></div></div>
<p class="noindent"> where <span
class="cmmi-10">C</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;C</span><sub><span
class="cmmi-7">n</span></sub> are all the constructors of the datatype containing a field labeled with <span
class="cmmi-10">f</span>, <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">ij</span></sub> is <span
class="pcrr7t-">y</span> when <span
class="cmmi-10">f</span> labels
the <span
class="cmmi-10">j</span>th component of <span
class="cmmi-10">C</span><sub><span
class="cmmi-7">i</span></sub> or <span
class="pcrr7t-">_</span> otherwise, and <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">i</span></sub> is <span
class="pcrr7t-">y</span> when some field in <span
class="cmmi-10">C</span><sub><span
class="cmmi-7">i</span></sub> has a label of <span
class="cmmi-10">f</span> or <span
class="pcrr7t-">undefined</span>
otherwise. </div></div>
</div>
<p class="noindent">
<h4 class="subsectionHead"><span class="titlemark">3.15.2 </span> <a
id="x8-520003.15.2"></a>Construction Using Field Labels</h4>
<a
id="dx8-52001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-43" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-43-1g"><col
id="TBL-43-1" /><col
id="TBL-43-2" /><col
id="TBL-43-3" /><col
id="TBL-43-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-43-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-43-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-43-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-43-1-3"
class="td11"> <span
class="cmmi-10">qcon</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-43-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>labeled&#x00A0;construction<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">0) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-43-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-43-2-1"
class="td11"> <span
class="cmmi-10">fbind </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-43-2-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-43-2-3"
class="td11"> <span
class="cmmi-10">qvar</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=</span><span
class="cmmi-10">&#x00A0;exp </span></td>
</tr></table></div></div>
<a
id="dx8-52002"></a>
<p class="noindent"> A constructor with labeled fields may be used to construct a value in which the components are specified by name
rather than by position. Unlike the braces used in declaration lists, these are not subject to layout; the <span
class="pcrr7t-">{</span> and <span
class="pcrr7t-">}</span>
characters must be explicit. (This is also true of field updates and field patterns.) Construction using field labels is
subject to the following constraints:
<ul class="itemize1">
<li class="itemize">Only field labels declared with the specified constructor may be mentioned.
</li>
<li class="itemize">A field label may not be mentioned more than once.
</li>
<li class="itemize">Fields not mentioned are initialized to <span
class="cmsy-10">&perp;</span>.
</li>
<li class="itemize">A compile-time error occurs when any strict fields (fields whose declared types are prefixed by <span
class="pcrr7t-">!</span>) are
omitted during construction. Strict fields are discussed in Section&#x00A0;<a
href="haskellch4.html#x10-710004.2.1">4.2.1<!--tex4ht:ref: strictness-flags --></a>.</li></ul>
<p class="noindent"> The expression <span
class="pcrr7t-">F</span><span
class="pcrr7t-">&#x00A0;{}</span>, where <span
class="pcrr7t-">F</span> is a data constructor, is legal <span
class="ptmri7t-">whether or not</span> <span
class="pcrr7t-">F</span> <span
class="ptmri7t-">was declared with record syntax</span>
(provided <span
class="pcrr7t-">F</span> has no strict fields &#8212; see the fourth bullet above); it denotes <span
class="pcrr7t-">F</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">&perp;</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">&perp;</span><sub><span
class="cmmi-7">n</span></sub>, where <span
class="cmmi-10">n</span> is the arity of
<span
class="pcrr7t-">F</span>.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-530003.15.2"></a>Translation:</span>
In the binding <span
class="cmmi-10">f</span> <span
class="pcrr7t-">=</span> <span
class="cmmi-10">v</span>, the field <span
class="cmmi-10">f</span> labels <span
class="cmmi-10">v</span>.
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-44" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-44-1g"><col
id="TBL-44-1" /><col
id="TBL-44-2" /><col
id="TBL-44-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-44-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-44-1-1"
class="td11"> <span
class="cmmi-10">C</span> <span
class="pcrr7t-">{</span> <span
class="cmmi-10">bs</span> <span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-44-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-44-1-3"
class="td11"> <span
class="cmmi-10">C</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">pick</span><sub><span
class="cmr-7">1</span></sub><sup><span
class="cmmi-7">C</span></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">undefined</span><span
class="cmr-10">)</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">pick</span><sub><span
class="cmmi-7">k</span></sub><sup><span
class="cmmi-7">C</span></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">undefined</span><span
class="cmr-10">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-44-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-44-2-1"
class="td11"> </td></tr></table></div></div>
<p class="noindent"> where <span
class="cmmi-10">k</span> is the arity of <span
class="cmmi-10">C</span>.
<p class="noindent"> The auxiliary function <span
class="cmmi-10">pick</span><sub><span
class="cmmi-7">i</span></sub><sup><span
class="cmmi-7">C</span></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;d</span> is defined as follows:
<div class="quote">
<p class="noindent"> If the <span
class="cmmi-10">i</span>th component of a constructor <span
class="cmmi-10">C</span> has the field label <span
class="cmmi-10">f</span>, and if <span
class="cmmi-10">f </span><span
class="cmr-10">= </span><span
class="cmmi-10">v</span> appears in the
binding list <span
class="cmmi-10">bs</span>, then <span
class="cmmi-10">pick</span><sub><span
class="cmmi-7">i</span></sub><sup><span
class="cmmi-7">C</span></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;d</span> is <span
class="cmmi-10">v</span>. Otherwise, <span
class="cmmi-10">pick</span><sub><span
class="cmmi-7">i</span></sub><sup><span
class="cmmi-7">C</span></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;d</span> is the default value <span
class="cmmi-10">d</span>.</div> </div></div>
</div>
<p class="noindent">
<h4 class="subsectionHead"><span class="titlemark">3.15.3 </span> <a
id="x8-540003.15.3"></a>Updates Using Field Labels</h4>
<a
id="dx8-54001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-45" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-45-1g"><col
id="TBL-45-1" /><col
id="TBL-45-2" /><col
id="TBL-45-3" /><col
id="TBL-45-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-45-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-45-1-1"
class="td11"> <span
class="cmmi-10">aexp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-45-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-45-1-3"
class="td11"> <span
class="cmmi-10">aexp</span><sub><span
class="cmsy-7">&#x27E8;</span><span
class="cmmi-7">qcon</span><span
class="cmsy-7">&#x27E9;</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;fbind</span><sub><span
class="cmmi-7">n</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-45-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>labeled&#x00A0;update<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;n </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr></table>
</div></div>
<p class="noindent"> Values belonging to a datatype with field labels may be non-destructively updated. This creates a new value in which
the specified field values replace those in the existing value. Updates are restricted in the following
ways:
<ul class="itemize1">
<li class="itemize">All labels must be taken from the same datatype.
</li>
<li class="itemize">At least one constructor must define all of the labels mentioned in the update.
</li>
<li class="itemize">No label may be mentioned more than once.
</li>
<li class="itemize">An execution error occurs when the value being updated does not contain all of the specified labels.</li></ul>
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-550003.15.3"></a>Translation:</span>
Using the prior definition of <span
class="cmmi-10">pick</span>,
<div class="center"
>
<p class="noindent">
<div class="tabular"> <table id="TBL-46" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-46-1g"><col
id="TBL-46-1" /><col
id="TBL-46-2" /><col
id="TBL-46-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-46-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-46-1-1"
class="td11"> <span
class="cmmi-10">e</span> <span
class="pcrr7t-">{</span> <span
class="cmmi-10">bs</span> <span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-46-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-46-1-3"
class="td11"> <span
class="pcrr7t-">case</span> <span
class="cmmi-10">e</span> <span
class="pcrr7t-">of</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-46-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-46-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-46-2-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-46-2-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">C</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmmi-7">k</span><sub><span
class="cmr-5">1</span></sub></sub> <span
class="pcrr7t-">-&#x003E;</span> <span
class="cmmi-10">C</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">pick</span><sub><span
class="cmr-7">1</span></sub><sup><span
class="cmmi-7">C</span><sub><span
class="cmr-5">1</span></sub></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmr-7">1</span></sub><span
class="cmr-10">)</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">pick</span><sub><span
class="cmmi-7">k</span><sub>
<span
class="cmr-5">1</span></sub></sub><sup><span
class="cmmi-7">C</span><sub><span
class="cmr-5">1</span></sub></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;v</span><sub>
<span
class="cmmi-7">k</span><sub><span
class="cmr-5">1</span></sub></sub><span
class="cmr-10">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-46-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-46-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-46-3-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-46-3-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span> ... </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-46-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-46-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-46-4-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-46-4-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">C</span><sub><span
class="cmmi-7">j</span></sub><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmmi-7">k</span><sub><span
class="cmmi-5">j</span></sub></sub> <span
class="pcrr7t-">-&#x003E;</span> <span
class="cmmi-10">C</span><sub><span
class="cmmi-7">j</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">pick</span><sub><span
class="cmr-7">1</span></sub><sup><span
class="cmmi-7">C</span><sub><span
class="cmmi-5">j</span></sub></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmr-7">1</span></sub><span
class="cmr-10">)</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">pick</span><sub><span
class="cmmi-7">k</span><sub>
<span
class="cmmi-5">j</span></sub></sub><sup><span
class="cmmi-7">C</span><sub><span
class="cmmi-5">j</span></sub></sup><span
class="cmmi-10">&#x00A0;bs</span><span
class="cmmi-10">&#x00A0;v</span><sub>
<span
class="cmmi-7">k</span><sub><span
class="cmmi-5">j</span></sub></sub><span
class="cmr-10">)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-46-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-46-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-46-5-2"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-46-5-3"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;_</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;error</span><span
class="pcrr7t-">&#x00A0;"Update</span><span
class="pcrr7t-">&#x00A0;error"</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-46-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-46-6-1"
class="td11"> </td></tr></table></div></div>
<p class="noindent"> where <span
class="cmsy-10">{</span><span
class="cmmi-10">C</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">,</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">,C</span><sub><span
class="cmmi-7">j</span></sub><span
class="cmsy-10">}</span> is the set of constructors containing all labels in <span
class="cmmi-10">bs</span>, and <span
class="cmmi-10">k</span><sub><span
class="cmmi-7">i</span></sub> is the arity of <span
class="cmmi-10">C</span><sub><span
class="cmmi-7">i</span></sub>. </div></div>
</div>
<p class="noindent"> Here are some examples using labeled fields:
<div class="quote">
<div class="verbatim" id="verbatim-17">
data&#x00A0;T&#x00A0;&#x00A0;&#x00A0;&#x00A0;=&#x00A0;C1&#x00A0;{f1,f2&#x00A0;::&#x00A0;Int}
&#x00A0;<br />&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;|&#x00A0;C2&#x00A0;{f1&#x00A0;::&#x00A0;Int,
&#x00A0;<br />&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;f3,f4&#x00A0;::&#x00A0;Char}
</div>
<p class="noindent"></div>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"><table id="TBL-47" class="tabular"
cellspacing="0" cellpadding="0" rules="groups"
><colgroup id="TBL-47-1g"><col
id="TBL-47-1" /></colgroup><colgroup id="TBL-47-2g"><col
id="TBL-47-2" /></colgroup><tr
class="hline"><td><hr /></td><td><hr /></td></tr><tr
style="vertical-align:baseline;" id="TBL-47-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-47-1-1"
class="td11"> Expression </td><td style="white-space:nowrap; text-align:left;" id="TBL-47-1-2"
class="td11"> Translation </td>
</tr><tr
class="hline"><td><hr /></td><td><hr /></td></tr><tr
style="vertical-align:baseline;" id="TBL-47-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-47-2-1"
class="td11"> <span
class="pcrr7t-">C1</span><span
class="pcrr7t-">&#x00A0;{f1</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;3}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-47-2-2"
class="td11"> <span
class="pcrr7t-">C1</span><span
class="pcrr7t-">&#x00A0;3</span><span
class="pcrr7t-">&#x00A0;undefined</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-47-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-47-3-1"
class="td11"> <span
class="pcrr7t-">C2</span><span
class="pcrr7t-">&#x00A0;{f1</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;1,</span><span
class="pcrr7t-">&#x00A0;f4</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;'A',</span><span
class="pcrr7t-">&#x00A0;f3</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;'B'}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-47-3-2"
class="td11"> <span
class="pcrr7t-">C2</span><span
class="pcrr7t-">&#x00A0;1</span><span
class="pcrr7t-">&#x00A0;'B'</span><span
class="pcrr7t-">&#x00A0;'A'</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-47-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-47-4-1"
class="td11"> <span
class="pcrr7t-">x</span><span
class="pcrr7t-">&#x00A0;{f1</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;1}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-47-4-2"
class="td11"> <span
class="pcrr7t-">case</span><span
class="pcrr7t-">&#x00A0;x</span><span
class="pcrr7t-">&#x00A0;of</span><span
class="pcrr7t-">&#x00A0;C1</span><span
class="pcrr7t-">&#x00A0;_</span><span
class="pcrr7t-">&#x00A0;f2</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;C1</span><span
class="pcrr7t-">&#x00A0;1</span><span
class="pcrr7t-">&#x00A0;f2</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-47-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-47-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-47-5-2"
class="td11"> <span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;C2</span><span
class="pcrr7t-">&#x00A0;_</span><span
class="pcrr7t-">&#x00A0;f3</span><span
class="pcrr7t-">&#x00A0;f4</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;C2</span><span
class="pcrr7t-">&#x00A0;1</span><span
class="pcrr7t-">&#x00A0;f3</span><span
class="pcrr7t-">&#x00A0;f4</span> </td>
</tr><tr
class="hline"><td><hr /></td><td><hr /></td></tr><tr
style="vertical-align:baseline;" id="TBL-47-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-47-6-1"
class="td11"> </td>
</tr></table> </div>
The field <span
class="pcrr7t-">f1</span> is common to both constructors in T. This example translates expressions using constructors
in field-label notation into equivalent expressions using the same constructors without field labels. A
compile-time error will result if no single constructor defines the set of field labels used in an update, such as
<span
class="pcrr7t-">x</span><span
class="pcrr7t-">&#x00A0;{f2</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;1,</span><span
class="pcrr7t-">&#x00A0;f3</span><span
class="pcrr7t-">&#x00A0;=</span><span
class="pcrr7t-">&#x00A0;'x'}</span>.
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.16 </span> <a
id="x8-560003.16"></a>Expression Type-Signatures</h3>
<a
id="dx8-56001"></a>
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-48" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-48-1g"><col
id="TBL-48-1" /><col
id="TBL-48-2" /><col
id="TBL-48-3" /><col
id="TBL-48-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-48-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-48-1-1"
class="td11"> <span
class="cmmi-10">exp </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-48-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-48-1-3"
class="td11"> <span
class="cmmi-10">exp</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">::</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="cmmi-10">context</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=&#x003E;</span><span
class="cmr-10">]</span><span
class="cmmi-10">&#x00A0;type </span></td>
</tr></table>
</div></div>
<a
id="dx8-56002"></a>
<a
id="dx8-56003"></a>
<p class="noindent"> <span
class="ptmri7t-">Expression type-signatures </span>have the form <span
class="cmmi-10">e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">::</span><span
class="cmmi-10">&#x00A0;t</span>, where <span
class="cmmi-10">e</span> is an expression and <span
class="cmmi-10">t</span> is a type (Section&#x00A0;<a
href="haskellch4.html#x10-650004.1.2">4.1.2<!--tex4ht:ref: type-syntax --></a>);
they are used to type an expression explicitly and may be used to resolve ambiguous typings due to
overloading (see Section&#x00A0;<a
href="haskellch4.html#x10-790004.3.4">4.3.4<!--tex4ht:ref: default-decls --></a>). The value of the expression is just that of <span
class="cmmi-10">exp</span>. As with normal type
signatures (see Section&#x00A0;<a
href="haskellch4.html#x10-810004.4.1">4.4.1<!--tex4ht:ref: type-signatures --></a>), the declared type may be more specific than the principal type derivable from
<span
class="cmmi-10">exp</span>, but it is an error to give a type that is more general than, or not comparable to, the principal type.
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><p class="noindent"> <span class="likeparagraphHead"><a
id="x8-570003.16"></a>Translation:</span>
<div class="center"
>
<p class="noindent">
<div class="tabular">
<table id="TBL-49" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-49-1g"><col
id="TBL-49-1" /><col
id="TBL-49-2" /><col
id="TBL-49-3" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-49-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-49-1-1"
class="td11"> <span
class="cmmi-10">e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">::</span><span
class="cmmi-10">&#x00A0;t</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-49-1-2"
class="td11"> = </td><td style="white-space:nowrap; text-align:left;" id="TBL-49-1-3"
class="td11"> <span
class="pcrr7t-">let</span><span
class="pcrr7t-">&#x00A0;{</span><span
class="cmmi-10">&#x00A0;v</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">::</span><span
class="cmmi-10">&#x00A0;t</span><span
class="pcrr7t-">;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">&#x00A0;v</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=</span><span
class="cmmi-10">&#x00A0;e</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span><span
class="pcrr7t-">&#x00A0;in</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmmi-10">v</span> </td></tr></table>
</div></div> </div></div>
</div>
<p class="noindent">
<h3 class="sectionHead"><span class="titlemark">3.17 </span> <a
id="x8-580003.17"></a>Pattern Matching</h3>
<a
id="dx8-58001"></a>
<p class="noindent"> <span
class="ptmri7t-">Patterns </span>appear in lambda abstractions, function definitions, pattern bindings, list comprehensions, do expressions,
and case expressions. However, the first five of these ultimately translate into case expressions, so defining the
semantics of pattern matching for case expressions is sufficient.
<p class="noindent">
<h4 class="subsectionHead"><span class="titlemark">3.17.1 </span> <a
id="x8-590003.17.1"></a>Patterns</h4>
<p class="noindent"> Patterns<a
id="dx8-59001"></a> have this syntax:
<div class="flushleft"
>
<p class="noindent">
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-50" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-50-1g"><col
id="TBL-50-1" /><col
id="TBL-50-2" /><col
id="TBL-50-3" /><col
id="TBL-50-4" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-50-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-1-1"
class="td11"> <span
class="cmmi-10">pat </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-50-1-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-1-3"
class="td11"> <span
class="cmmi-10">lpat</span><span
class="cmmi-10">&#x00A0;qconop</span><span
class="cmmi-10">&#x00A0;pat</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-1-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>infix&#x00A0;constructor<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-2-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-2-3"
class="td11"> <span
class="cmmi-10">lpat</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-3-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-50-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-4-1"
class="td11"></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-5-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-5-1"
class="td11"> <span
class="cmmi-10">lpat</span> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-5-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-5-3"
class="td11"> <span
class="cmmi-10">apat </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-6-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-6-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-6-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-6-3"
class="td11"> <span
class="pcrr7t-">-</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">(</span><span
class="cmmi-10">integer</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmsy-10">|</span><span
class="cmmi-10">&#x00A0;float</span><span
class="cmr-10">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-6-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>negative&#x00A0;literal<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-7-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-7-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-7-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-7-3"
class="td11"> <span
class="cmmi-10">gcon</span><span
class="cmmi-10">&#x00A0;apat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;apat</span><sub><span
class="cmmi-7">k</span></sub> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-7-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>arity<span
class="cmmi-10">&#x00A0;gcon</span><span
class="cmmi-10">&#x00A0; </span><span
class="cmr-10">=</span> <span
class="cmmi-10">&#x00A0;k,</span><span
class="cmmi-10">&#x00A0;k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-8-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-8-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-50-9-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-9-1"
class="td11"></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-10-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-10-1"
class="td11"> <span
class="cmmi-10">apat </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-50-10-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-10-3"
class="td11"> <span
class="cmmi-10">var</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">[</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">@</span><span
class="cmmi-10">&#x00A0;apat</span><span
class="cmr-10">] </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-50-10-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>as&#x00A0;pattern<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-11-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-11-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-11-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-11-3"
class="td11"> <span
class="cmmi-10">gcon </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-50-11-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>arity<span
class="cmmi-10">&#x00A0;gcon</span><span
class="cmmi-10">&#x00A0; </span><span
class="cmr-10">=</span> <span
class="cmmi-10">&#x00A0;</span><span
class="cmr-10">0) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-12-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-12-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-12-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-12-3"
class="td11"> <span
class="cmmi-10">qcon</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">{</span><span
class="cmmi-10">&#x00A0;fpat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;fpat</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-12-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>labeled&#x00A0;pattern<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">0) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-13-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-13-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-13-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-13-3"
class="td11"> <span
class="cmmi-10">literal </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-14-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-14-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-14-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-14-3"
class="td11"> <span
class="pcrr7t-">_</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-14-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>wildcard<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-15-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-15-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-15-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-15-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;pat</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-15-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>parenthesized&#x00A0;pattern<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-16-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-16-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-16-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-16-3"
class="td11"> <span
class="pcrr7t-">(</span><span
class="cmmi-10">&#x00A0;pat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;pat</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-16-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>tuple&#x00A0;pattern<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">2) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-17-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-17-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-17-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-17-3"
class="td11"> <span
class="pcrr7t-">[</span><span
class="cmmi-10">&#x00A0;pat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">,</span><span
class="cmmi-10">&#x00A0;pat</span><sub><span
class="cmmi-7">k</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-17-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>list&#x00A0;pattern<span
class="cmmi-10">,</span><span
class="cmmi-10">&#x00A0;k </span><span
class="cmsy-10">&ge; </span><span
class="cmr-10">1) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-18-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-18-1"
class="td11"> </td><td style="white-space:nowrap; text-align:center;" id="TBL-50-18-2"
class="td11"> <span
class="cmsy-10">|</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-18-3"
class="td11"> <span
class="pcrr7t-">~</span><span
class="cmmi-10">&#x00A0;apat </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-50-18-4"
class="td11"> <span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="ptmri7t-">&#x00A0;</span><span
class="cmr-10">(</span>irrefutable&#x00A0;pattern<span
class="cmr-10">) </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-19-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-19-1"
class="td11"> <span
class="ptmri7t-">&#x00A0; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-20-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-20-1"
class="td11"> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-50-21-"><td style="white-space:nowrap; text-align:left;" id="TBL-50-21-1"
class="td11"> <span
class="cmmi-10">fpat </span></td><td style="white-space:nowrap; text-align:center;" id="TBL-50-21-2"
class="td11"> <span
class="cmsy-10">&rarr;</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-21-3"
class="td11"> <span
class="cmmi-10">qvar</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">=</span><span
class="cmmi-10">&#x00A0;pat </span></td>
</tr></table></div></div>
<a
id="dx8-59002"></a>
<a
id="dx8-59003"></a>
<a
id="dx8-59004"></a>
<a
id="dx8-59005"></a>
<a
id="dx8-59006"></a>
<p class="noindent"> The arity of a constructor must match the number of sub-patterns associated with it; one cannot match against a
partially-applied constructor.
<p class="noindent"> All patterns must be <span
class="ptmri7t-">linear</span><a
id="dx8-59007"></a> <a
id="dx8-59008"></a>&#8212;no variable may appear more than once. For example, this definition is illegal:
<div class="quote">
<div class="verbatim" id="verbatim-18">
f&#x00A0;(x,x)&#x00A0;=&#x00A0;x&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;--&#x00A0;ILLEGAL;&#x00A0;x&#x00A0;used&#x00A0;twice&#x00A0;in&#x00A0;pattern
</div>
<p class="noindent"></div>
<p class="noindent"> Patterns of the form <span
class="cmmi-10">var</span><span
class="pcrr7t-">@</span><span
class="cmmi-10">pat</span> are called <span
class="ptmri7t-">as-patterns</span>, <a
id="dx8-59009"></a>and allow one to use <span
class="cmmi-10">var</span> as a name for the value being matched
by <span
class="cmmi-10">pat</span>. For example,
<div class="quote">
<div class="verbatim" id="verbatim-19">
case&#x00A0;e&#x00A0;of&#x00A0;{&#x00A0;xs@(x:rest)&#x00A0;-&#x003E;&#x00A0;if&#x00A0;x==0&#x00A0;then&#x00A0;rest&#x00A0;else&#x00A0;xs&#x00A0;}
</div>
<p class="noindent"></div>
<p class="noindent"> is equivalent to:
<div class="quote">
<div class="verbatim" id="verbatim-20">
let&#x00A0;{&#x00A0;xs&#x00A0;=&#x00A0;e&#x00A0;}&#x00A0;in
&#x00A0;<br />&#x00A0;&#x00A0;case&#x00A0;xs&#x00A0;of&#x00A0;{&#x00A0;(x:rest)&#x00A0;-&#x003E;&#x00A0;if&#x00A0;x==0&#x00A0;then&#x00A0;rest&#x00A0;else&#x00A0;xs&#x00A0;}
</div>
<p class="noindent"></div>
<p class="noindent"> Patterns of the form <span
class="pcrr7t-">_</span> are <span
class="ptmri7t-">wildcards</span><a
id="dx8-59010"></a> and are useful when some part of a pattern is not referenced on the
right-hand-side. It is as if an identifier not used elsewhere were put in its place. For example,
<div class="quote">
<div class="verbatim" id="verbatim-21">
case&#x00A0;e&#x00A0;of&#x00A0;{&#x00A0;[x,_,_]&#x00A0;&#x00A0;-&#x003E;&#x00A0;&#x00A0;if&#x00A0;x==0&#x00A0;then&#x00A0;True&#x00A0;else&#x00A0;False&#x00A0;}
</div>
<p class="noindent"></div>
<p class="noindent"> is equivalent to:
<div class="quote">
<div class="verbatim" id="verbatim-22">
case&#x00A0;e&#x00A0;of&#x00A0;{&#x00A0;[x,y,z]&#x00A0;&#x00A0;-&#x003E;&#x00A0;&#x00A0;if&#x00A0;x==0&#x00A0;then&#x00A0;True&#x00A0;else&#x00A0;False&#x00A0;}
</div>
<p class="noindent"></div>
<p class="noindent">
<h4 class="subsectionHead"><span class="titlemark">3.17.2 </span> <a
id="x8-600003.17.2"></a>Informal Semantics of Pattern Matching</h4>
<p class="noindent"> Patterns are matched against values. Attempting to match a pattern can have one of three results: it may <span
class="ptmri7t-">fail</span>; it may
<span
class="ptmri7t-">succeed</span>, returning a binding for each variable in the pattern; or it may <span
class="ptmri7t-">diverge </span>(i.e.&#x00A0;return <span
class="cmsy-10">&perp;</span>). Pattern matching
proceeds from left to right, and outside to inside, according to the following rules:
<ol class="enumerate1" >
<li
class="enumerate" id="x8-60002x1">Matching the pattern <span
class="cmmi-10">var</span> against a value <span
class="cmmi-10">v</span> always succeeds and binds <span
class="cmmi-10">var</span> to <span
class="cmmi-10">v</span>.
</li>
<li
class="enumerate" id="x8-60004x2">Matching the pattern <span
class="pcrr7t-">~</span><span
class="cmmi-10">apat</span> against a value <span
class="cmmi-10">v</span> always succeeds. The free variables in <span
class="cmmi-10">apat</span> are bound to
the appropriate values if matching <span
class="cmmi-10">apat</span> against <span
class="cmmi-10">v</span> would otherwise succeed, and to <span
class="cmsy-10">&perp;</span> if matching <span
class="cmmi-10">apat</span>
against <span
class="cmmi-10">v</span> fails or diverges. (Binding does <span
class="ptmri7t-">not </span>imply evaluation.)
<p class="noindent"> Operationally, this means that no matching is done on a <span
class="pcrr7t-">~</span><span
class="cmmi-10">apat</span> pattern until one of the variables in
<span
class="cmmi-10">apat</span> is used. At that point the entire pattern is matched against the value, and if the match fails or
diverges, so does the overall computation.
</li>
<li
class="enumerate" id="x8-60006x3">Matching the wildcard pattern <span
class="pcrr7t-">_</span> against any value always succeeds, and no binding is done.
</li>
<li
class="enumerate" id="x8-60008x4">Matching the pattern <span
class="cmmi-10">con</span><span
class="cmmi-10">&#x00A0;pat</span> against a value, where <span
class="cmmi-10">con</span> is a constructor defined by <span
class="pcrr7t-">newtype</span>, depends on the
value:
<ul class="itemize1">
<li class="itemize">If the value is of the form <span
class="cmmi-10">con</span><span
class="cmmi-10">&#x00A0;v</span>, then <span
class="cmmi-10">pat</span> is matched against <span
class="cmmi-10">v</span>.
</li>
<li class="itemize">If the value is <span
class="cmsy-10">&perp;</span>, then <span
class="cmmi-10">pat</span> is matched against <span
class="cmsy-10">&perp;</span>.</li></ul>
<p class="noindent"> That is, constructors associated with <span
class="pcrr7t-">newtype</span> serve only to change the type of a value.<a
id="dx8-60009"></a>
</li>
<li
class="enumerate" id="x8-60011x5">Matching the pattern <span
class="cmmi-10">con</span><span
class="cmmi-10">&#x00A0;pat</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;pat</span><sub><span
class="cmmi-7">n</span></sub> against a value, where <span
class="cmmi-10">con</span> is a constructor defined by <span
class="pcrr7t-">data</span>, depends
on the value:
<ul class="itemize1">
<li class="itemize">If the value is of the form <span
class="cmmi-10">con</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmmi-7">n</span></sub>, sub-patterns are matched left-to-right against the
components of the data value; if all matches succeed, the overall match succeeds; the first to fail
or diverge causes the overall match to fail or diverge, respectively.
</li>
<li class="itemize">If the value is of the form <span
class="cmmi-10">con</span><span
class="cmsy-10">&prime;</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmr-7">1</span></sub><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&hellip;</span><span
class="cmmi-10">&#x00A0;v</span><sub><span
class="cmmi-7">m</span></sub>, where <span
class="cmmi-10">con</span> is a different constructor to <span
class="cmmi-10">con</span><span
class="cmsy-10">&prime;</span>, the match
fails.
</li>
<li class="itemize">If the value is <span
class="cmsy-10">&perp;</span>, the match diverges.</li></ul>
</li>
<li
class="enumerate" id="x8-60013x6">Matching against a constructor using labeled fields is the same as matching ordinary constructor patterns except
that the fields are matched in the order they are named in the field list. All fields listed must be declared by the
constructor; fields may not be named more than once. Fields not named by the pattern are ignored (matched
against <span
class="pcrr7t-">_</span>).
</li>
<li
class="enumerate" id="x8-60015x7">Matching a numeric, character, or string literal pattern <span
class="cmmi-10">k</span> against a value <span
class="cmmi-10">v</span> <a
id="dx8-60016"></a>succeeds if <span
class="cmmi-10">v</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;</span><span
class="pcrr7t-">==</span><span
class="cmmi-10">&#x00A0;</span><span
class="cmmi-10">&#x00A0;k</span>, where <span
class="pcrr7t-">==</span> is
overloaded based on the type of the pattern. The match diverges if this test diverges.
<p class="noindent"> The interpretation of numeric literals is exactly as described in Section&#x00A0;<a
href="#x8-240003.2">3.2<!--tex4ht:ref: vars-and-lits --></a>; that is, the overloaded function
<span
class="pcrr7t-">fromInteger</span> or <span
class="pcrr7t-">fromRational</span> is applied to an <span
class="pcrr7t-">Integer</span> or <span
class="pcrr7t-">Rational</span> literal (resp) to convert it to the
appropriate type.
</li>
<li
class="enumerate" id="x8-60018x8">Matching an as-pattern <span
class="cmmi-10">var</span><span
class="pcrr7t-">@</span><span
class="cmmi-10">apat</span> against a value <span
class="cmmi-10">v</span> is <a
id="dx8-60019"></a>the result of matching <span
class="cmmi-10">apat</span> against <span
class="cmmi-10">v</span>, augmented with
the binding of <span
class="cmmi-10">var</span> to <span
class="cmmi-10">v</span>. If the match of <span
class="cmmi-10">apat</span> against <span
class="cmmi-10">v</span> fails or diverges, then so does the overall
match.</li></ol>
<p class="noindent"> Aside from the obvious static type constraints (for example, it is a static error to match a character against a
boolean), the following static class constraints hold:
<ul class="itemize1">
<li class="itemize">An integer literal pattern <a
id="dx8-60020"></a>can only be matched against a value in the class <span
class="pcrr7t-">Num</span>.
</li>
<li class="itemize">A floating literal pattern <a
id="dx8-60021"></a>can only be matched against a value in the class <span
class="pcrr7t-">Fractional</span>.</li></ul>
<p class="noindent"> It is sometimes helpful to distinguish two kinds of patterns. Matching an <span
class="ptmri7t-">irrefutable pattern</span> <a
id="dx8-60022"></a>is non-strict: the pattern
matches even if the value to be matched is <span
class="cmsy-10">&perp;</span>. Matching a <span
class="ptmri7t-">refutable </span>pattern is strict: if the value to be matched <a
id="dx8-60023"></a>is <span
class="cmsy-10">&perp;</span>
the match diverges. The irrefutable patterns are as follows: a variable, a wildcard, <span
class="cmmi-10">N</span><span
class="cmmi-10">&#x00A0;apat</span> where <span
class="cmmi-10">N</span>
is a constructor defined by <span
class="pcrr7t-">newtype</span> and <span
class="cmmi-10">apat</span> is irrefutable (see Section&#x00A0;<a
href="haskellch4.html#x10-740004.2.3">4.2.3<!--tex4ht:ref: datatype-renaming --></a>), <a
id="dx8-60024"></a><span
class="cmmi-10">var</span><span
class="pcrr7t-">@</span><span
class="cmmi-10">apat</span> where
<span
class="cmmi-10">apat</span> is irrefutable, or of the form <span
class="pcrr7t-">~</span><span
class="cmmi-10">apat</span> (whether or not <span
class="cmmi-10">apat</span> is irrefutable). All other patterns are
<span
class="ptmri7t-">refutable</span>.
<p class="noindent"> Here are some examples:
<ol class="enumerate1" >
<li
class="enumerate" id="x8-60026x1">If the pattern <span
class="pcrr7t-">['a','b']</span> is matched against <span
class="pcrr7t-">['x',</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">]</span>, then <span
class="pcrr7t-">'a'</span> <span
class="cmmi-10">fails</span> to match against <span
class="pcrr7t-">'x'</span>, and
the result is a failed match. But if <span
class="pcrr7t-">['a','b']</span> is matched against <span
class="pcrr7t-">[</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">,'x']</span>, then attempting to
match <span
class="pcrr7t-">'a'</span> against <span
class="cmsy-10">&perp;</span> causes the match to <span
class="cmmi-10">diverge</span>.
</li>
<li
class="enumerate" id="x8-60028x2">These examples demonstrate refutable vs.&#x00A0;irrefutable matching:
<div class="tabular"> <table id="TBL-51" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-51-1g"><col
id="TBL-51-1" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-51-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-51-1-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~(x,y)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;0)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;0</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-51-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-51-2-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;(x,y)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;0)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp; </span></td></tr></table>
</div>
<div class="tabular"><table id="TBL-52" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-52-1g"><col
id="TBL-52-1" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-52-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-52-1-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~[x]</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;0)</span><span
class="pcrr7t-">&#x00A0;[]</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;0</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-52-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-52-2-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~[x]</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x)</span><span
class="pcrr7t-">&#x00A0;[]</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp; </span></td></tr></table>
</div>
<div class="tabular"><table id="TBL-53" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-53-1g"><col
id="TBL-53-1" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-53-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-53-1-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~[x,~(a,b)]</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x)</span><span
class="pcrr7t-">&#x00A0;[(0,1),</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">]</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;(0,1)</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-53-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-53-2-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~[x,</span><span
class="pcrr7t-">&#x00A0;(a,b)]</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x)</span><span
class="pcrr7t-">&#x00A0;[(0,1),</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">]</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp; </span></td></tr></table>
</div>
<div class="tabular"><table id="TBL-54" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-54-1g"><col
id="TBL-54-1" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-54-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-54-1-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;(x:xs)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x:x:xs)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-54-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-54-2-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~(x:xs)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;x:x:xs)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">:</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">:</span><span
class="cmsy-10">&perp; </span></td></tr></table>
</div>
</li>
<li
class="enumerate" id="x8-60030x3">Consider the following declarations:
<div class="quote">
<div class="verbatim" id="verbatim-23">
&#x00A0;&#x00A0;newtype&#x00A0;N&#x00A0;=&#x00A0;N&#x00A0;Bool
&#x00A0;<br />&#x00A0;&#x00A0;data&#x00A0;&#x00A0;&#x00A0;&#x00A0;D&#x00A0;=&#x00A0;D&#x00A0;!Bool
</div>
<p class="noindent"></div>
<p class="noindent"> These examples illustrate the difference in pattern matching between types defined by <span
class="pcrr7t-">data</span> and
<span
class="pcrr7t-">newtype</span>:
<div class="tabular"> <table id="TBL-55" class="tabular"
cellspacing="0" cellpadding="0"
><colgroup id="TBL-55-1g"><col
id="TBL-55-1" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-55-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-55-1-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;(N</span><span
class="pcrr7t-">&#x00A0;True)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;True)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-55-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-55-2-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;(D</span><span
class="pcrr7t-">&#x00A0;True)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;True)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-55-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-55-3-1"
class="td11"> <span
class="pcrr7t-">(\</span><span
class="pcrr7t-">&#x00A0;~(D</span><span
class="pcrr7t-">&#x00A0;True)</span><span
class="pcrr7t-">&#x00A0;-&#x003E;</span><span
class="pcrr7t-">&#x00A0;True)</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&perp;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="cmsy-10">&rArr;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;</span><span
class="pcrr7t-">&#x00A0;True</span> </td></tr></table>
</div>
<p class="noindent"> Additional examples may be found in Section&#x00A0;<a
href="haskellch4.html#x10-740004.2.3">4.2.3<!--tex4ht:ref: datatype-renaming --></a>.
</li></ol>
<p class="noindent"> Top level patterns in case expressions and the set of top level patterns in function or pattern bindings may have zero
or more associated <span
class="ptmri7t-">guards</span><a
id="dx8-60031"></a>. See Section&#x00A0;<a
href="#x8-460003.13">3.13<!--tex4ht:ref: case --></a> for the syntax and semantics of guards.
<p class="noindent"> The guard semantics have an influence on the strictness characteristics of a function or case expression.
In particular, an otherwise irrefutable pattern <a
id="dx8-60032"></a>may be evaluated because of a guard. For example, in
<div class="quote">
<div class="verbatim" id="verbatim-24">
f&#x00A0;::&#x00A0;(Int,Int,Int)&#x00A0;-&#x003E;&#x00A0;[Int]&#x00A0;-&#x003E;&#x00A0;Int
&#x00A0;<br />f&#x00A0;~(x,y,z)&#x00A0;[a]&#x00A0;|&#x00A0;(a&#x00A0;==&#x00A0;y)&#x00A0;=&#x00A0;1
</div>
<p class="noindent"></div>
<p class="noindent"> both <span
class="pcrr7t-">a</span> and <span
class="pcrr7t-">y</span> will be evaluated by <span
class="pcrr7t-">==</span> in the guard.
<p class="noindent">
<h4 class="subsectionHead"><span class="titlemark">3.17.3 </span> <a
id="x8-610003.17.3"></a>Formal Semantics of Pattern Matching</h4>
<p class="noindent"> The semantics of all pattern matching constructs other than <span
class="pcrr7t-">case</span> expressions are defined by giving identities that
relate those constructs to <span
class="pcrr7t-">case</span> expressions. The semantics of <span
class="pcrr7t-">case</span> expressions themselves are in turn
given as a series of identities, in Figures&#x00A0;<a
href="#x8-610011">3.1<!--tex4ht:ref: simple-case-expr-1 --></a>&#8211;<a
href="#x8-610033">3.3<!--tex4ht:ref: simple-case-expr-3 --></a>. Any implementation should behave so that these
identities hold; it is not expected that it will use them directly, since that would generate rather inefficient
code.
<hr class="figure" /><div class="figure"
>
<a
id="x8-610011"></a>
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><div class="tabular"> <table id="TBL-56" class="tabular"
cellspacing="0" cellpadding="0" rules="groups"
><colgroup id="TBL-56-1g"><col
id="TBL-56-1" /><col
id="TBL-56-2" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-56-1-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-1-1"
class="td11"><span
class="ptmr7t-x-x-90">(a) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-56-1-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">alts</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;(\</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">alts</span><span
class="pcrr7t-x-x-90">&#x00A0;})</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-2-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-2-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">v </span><span
class="ptmr7t-x-x-90">is a new variable </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-56-3-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-3-1"
class="td11"><span
class="ptmr7t-x-x-90">(b) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-56-3-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">p</span><sub>
<span
class="cmr-6">1</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&#x00A0;match</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><sub><span
class="cmmi-6">n</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&#x00A0;match</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-4-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-4-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&#x00A0;match</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-5-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-5-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-6-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-6-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-6-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><sub><span
class="cmmi-6">n</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&#x00A0;match</span><sub><span
class="cmmi-6">n</span></sub><span
class="ptmr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-7-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-7-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-7-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;error</span><span
class="pcrr7t-x-x-90">&#x00A0;"No</span><span
class="pcrr7t-x-x-90">&#x00A0;match"</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-8-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-8-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-8-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="ptmr7t-x-x-90">where each </span><span
class="cmmi-9">match</span><sub><span
class="cmmi-6">i</span></sub> <span
class="ptmr7t-x-x-90">has the form: </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-9-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-9-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-9-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">gs</span><sub><span
class="cmmi-6">i,</span><span
class="cmr-6">1</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmmi-6">i,</span><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;;</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">gs</span><sub><span
class="cmmi-6">i,m</span><sub><span
class="cmmi-5">i</span></sub></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmmi-6">i,m</span><sub><span
class="cmmi-5">i</span></sub></sub><span
class="pcrr7t-x-x-90">&#x00A0;where</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">decls</span><sub><span
class="cmmi-6">i</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-56-10-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-10-1"
class="td11"> <span
class="ptmr7t-x-x-90">(c) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-56-10-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">gs</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-11-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-11-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-11-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">gs</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;where</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">decls</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-12-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-12-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-12-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-13-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-13-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-13-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">y</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-14-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-14-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-14-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-15-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-15-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-15-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;let</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">decls</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;in</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-16-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-16-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-16-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-17-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-17-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-17-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">gs</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-18-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-18-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-18-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-19-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-19-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-19-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">gs</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-20-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-20-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-20-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">y</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-21-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-21-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-21-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">y</span><span
class="pcrr7t-x-x-90">&#x00A0;}}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-22-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-22-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-22-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">y </span><span
class="ptmr7t-x-x-90">is a new variable </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-56-23-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-23-1"
class="td11"><span
class="ptmr7t-x-x-90">(d) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-56-23-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;~</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-24-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-24-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-24-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;(\</span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub> <span
class="cmmi-9">&hellip;</span> <span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub> <span
class="pcrr7t-x-x-90">-&#x003E;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">)</span><span
class="pcrr7t-x-x-90">&#x00A0;(case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">-&#x003E;</span> <span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;})</span><span
class="cmmi-9">&hellip;</span> <span
class="pcrr7t-x-x-90">(case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">})</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-25-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-25-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-25-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">,</span><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">,x</span><sub><span
class="cmmi-6">n</span></sub> <span
class="ptmr7t-x-x-90">are all the variables in </span><span
class="cmmi-9">p </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-56-26-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-26-1"
class="td11"> <span
class="ptmr7t-x-x-90">(e) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-56-26-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><span
class="pcrr7t-x-x-90">@</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-56-27-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-27-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-56-27-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;(</span><span
class="pcrr7t-x-x-90">&#x00A0;\</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;)</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-56-28-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-28-1"
class="td11"> <span
class="ptmr7t-x-x-90">(f) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-56-28-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-56-29-"><td style="white-space:nowrap; text-align:center;" id="TBL-56-29-1"
class="td11"> </td></tr></table></div> </div></div>
</div>
<br /><div class="caption"
><span class="id">Figure&#x00A0;3.1: </span><span
class="content">Semantics of Case Expressions, Part 1</span></div><!--tex4ht:label?: x8-610011 -->
</div><hr class="endfigure" />
<hr class="figure" /><div class="figure"
>
<a
id="x8-610022"></a>
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><div class="tabular"> <table id="TBL-57" class="tabular"
cellspacing="0" cellpadding="0" rules="groups"
><colgroup id="TBL-57-1g"><col
id="TBL-57-1" /><col
id="TBL-57-2" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-57-1-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-1-1"
class="td11"><span
class="ptmr7t-x-x-90">(g) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-1-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">K</span><span
class="cmmi-9">&#x00A0;p</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">p</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-2-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-2-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-3-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-3-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">K</span><span
class="cmmi-9">&#x00A0;x</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-4-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-4-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-5-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-5-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-6-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-6-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-6-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
class="vspace" style="font-size:2.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-7-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-7-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-7-2"
class="td11"> <span
class="ptmr7t-x-x-90">at least one of </span><span
class="cmmi-9">p</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">,</span><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">,p</span><sub><span
class="cmmi-6">n</span></sub> <span
class="ptmr7t-x-x-90">is not a variable; </span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">,</span><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">,x</span><sub><span
class="cmmi-6">n</span></sub> <span
class="ptmr7t-x-x-90">are new variables </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-8-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-8-1"
class="td11"> <span
class="ptmr7t-x-x-90">(h) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-8-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">k</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;if</span><span
class="pcrr7t-x-x-90">&#x00A0;(</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">==</span><span
class="cmmi-9">k</span><span
class="pcrr7t-x-x-90">)</span><span
class="pcrr7t-x-x-90">&#x00A0;then</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;else</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-9-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-9-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-9-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">k </span><span
class="ptmr7t-x-x-90">is a numeric, character, or string literal </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-10-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-10-1"
class="td11"> <span
class="ptmr7t-x-x-90">(i) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-10-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-11-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-11-1"
class="td11"> <span
class="ptmr7t-x-x-90">(j) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-11-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;(</span><span
class="pcrr7t-x-x-90">&#x00A0;\</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;)</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-12-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-12-1"
class="td11"> <span
class="ptmr7t-x-x-90">(k) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-12-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">N v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">N</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-13-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-13-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-13-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">v</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-14-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-14-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-14-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">N </span><span
class="ptmr7t-x-x-90">is a</span> <span
class="pcrr7t-x-x-90">newtype</span> <span
class="ptmr7t-x-x-90">constructor </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-15-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-15-1"
class="td11"> <span
class="ptmr7t-x-x-90">(l) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-15-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmsy-9">&perp;</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">N</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmsy-9">&perp;</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-16-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-16-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-16-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">N </span><span
class="ptmr7t-x-x-90">is a</span> <span
class="pcrr7t-x-x-90">newtype</span> <span
class="ptmr7t-x-x-90">constructor </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-17-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-17-1"
class="td11"><span
class="ptmr7t-x-x-90">(m) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-17-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">K</span> <span
class="pcrr7t-x-x-90">&#x00A0;{</span> <span
class="cmmi-9">f</span><sub><span
class="cmr-6">1</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">p</span><sub><span
class="cmr-6">1</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;,</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">f</span><sub><span
class="cmr-6">2</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">p</span><sub><span
class="cmr-6">2</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;,</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span> <span
class="pcrr7t-x-x-90">}</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-18-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-18-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-18-2"
class="td11"> <span
class="cmr-9">=</span> <span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td></tr><tr
style="vertical-align:baseline;" id="TBL-57-19-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-19-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-19-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">y</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-20-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-20-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-20-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-21-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-21-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-21-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">K</span> <span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">f</span><sub><span
class="cmr-6">1</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">p</span><sub><span
class="cmr-6">1</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-22-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-22-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-22-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> <span
class="cmmi-9">K</span> <span
class="pcrr7t-x-x-90">&#x00A0;{</span> <span
class="cmmi-9">f</span><sub><span
class="cmr-6">2</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">p</span><sub><span
class="cmr-6">2</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;,</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span> <span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">y</span> <span
class="pcrr7t-x-x-90">&#x00A0;};</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-23-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-23-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-23-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">y</span> <span
class="pcrr7t-x-x-90">&#x00A0;}}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-24-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-24-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-24-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">f</span><sub><span
class="cmr-6">1</span></sub><span
class="ptmr7t-x-x-90">, </span><span
class="cmmi-9">f</span><sub><span
class="cmr-6">2</span></sub><span
class="ptmr7t-x-x-90">,</span> <span
class="cmmi-9">&hellip;</span> <span
class="ptmr7t-x-x-90">are fields of constructor </span><span
class="cmmi-9">K</span><span
class="ptmr7t-x-x-90">; </span><span
class="cmmi-9">y </span><span
class="ptmr7t-x-x-90">is a new variable </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-25-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-25-1"
class="td11"> <span
class="ptmr7t-x-x-90">(n) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-25-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">K</span> <span
class="pcrr7t-x-x-90">&#x00A0;{</span> <span
class="cmmi-9">f</span> <span
class="pcrr7t-x-x-90">&#x00A0;=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">p</span> <span
class="pcrr7t-x-x-90">}</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-26-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-26-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-26-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-27-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-27-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-27-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">K p</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">&#x00A0;p</span><sub><span
class="cmmi-6">n</span></sub> <span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-28-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-28-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-28-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">p</span><sub><span
class="cmmi-6">i</span></sub> <span
class="ptmr7t-x-x-90">is </span><span
class="cmmi-9">p </span><span
class="ptmr7t-x-x-90">if </span><span
class="cmmi-9">f </span><span
class="ptmr7t-x-x-90">labels the </span><span
class="cmmi-9">i</span><span
class="ptmr7t-x-x-90">th component of </span><span
class="cmmi-9">K</span><span
class="ptmr7t-x-x-90">,</span> <span
class="pcrr7t-x-x-90">_</span> <span
class="ptmr7t-x-x-90">otherwise </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-29-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-29-1"
class="td11"> <span
class="ptmr7t-x-x-90">(o) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-29-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">K</span> <span
class="pcrr7t-x-x-90">&#x00A0;{}</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-30-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-30-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-30-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">v</span> <span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-31-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-31-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-31-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">K</span> <span
class="pcrr7t-x-x-90">_</span><span
class="cmmi-9">&hellip;</span> <span
class="pcrr7t-x-x-90">_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span> <span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span> <span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-32-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-32-1"
class="td11"> <span
class="ptmr7t-x-x-90">(p) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-32-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;(</span><span
class="cmmi-9">K</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmmi-6">m</span></sub><span
class="pcrr7t-x-x-90">)</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">K</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-33-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-33-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-33-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">K </span><span
class="ptmr7t-x-x-90">and </span><span
class="cmmi-9">K</span><span
class="cmsy-9">&prime; </span><span
class="ptmr7t-x-x-90">are distinct</span> <span
class="pcrr7t-x-x-90">data</span> <span
class="ptmr7t-x-x-90">constructors of arity </span><span
class="cmmi-9">n </span><span
class="ptmr7t-x-x-90">and </span><span
class="cmmi-9">m</span><span
class="ptmr7t-x-x-90">, respectively </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-34-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-34-1"
class="td11"> <span
class="ptmr7t-x-x-90">(q) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-34-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;(</span><span
class="cmmi-9">K</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">)</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">K</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-35-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-35-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-35-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;(\</span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">&#x00A0;x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">)</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">1</span></sub><span
class="cmmi-9">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="cmmi-9">&#x00A0;e</span><sub><span
class="cmmi-6">n</span></sub> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-36-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-36-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-36-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">K </span><span
class="ptmr7t-x-x-90">is a</span> <span
class="pcrr7t-x-x-90">data</span> <span
class="ptmr7t-x-x-90">constructor of arity </span><span
class="cmmi-9">n </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-37-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-37-1"
class="td11"> <span
class="ptmr7t-x-x-90">(r) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-57-37-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="ptmr7t-x-x-90">&#x00A0;</span><span
class="cmsy-9">&perp;</span><span
class="ptmr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">K</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">x</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="ptmr7t-x-x-90">&#x00A0;</span><span
class="cmr-9">=</span><span
class="ptmr7t-x-x-90">&#x00A0; </span><span
class="cmsy-9">&perp; </span></td>
</tr><tr
style="vertical-align:baseline;" id="TBL-57-38-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-38-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-57-38-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">K </span><span
class="ptmr7t-x-x-90">is a</span> <span
class="pcrr7t-x-x-90">data</span> <span
class="ptmr7t-x-x-90">constructor of arity </span><span
class="cmmi-9">n </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-57-39-"><td style="white-space:nowrap; text-align:center;" id="TBL-57-39-1"
class="td11"> </td></tr></table></div> </div></div>
</div>
<br /><div class="caption"
><span class="id">Figure&#x00A0;3.2: </span><span
class="content">Semantics of Case Expressions, Part 2</span></div><!--tex4ht:label?: x8-610022 -->
</div><hr class="endfigure" />
<hr class="figure" /><div class="figure"
>
<a
id="x8-610033"></a>
<div class="center"
>
<p class="noindent">
<div class="fbox"><div class="minipage"><div class="tabular"> <table id="TBL-58" class="tabular"
cellspacing="0" cellpadding="0" rules="groups"
><colgroup id="TBL-58-1g"><col
id="TBL-58-1" /><col
id="TBL-58-2" /></colgroup><tr
style="vertical-align:baseline;" id="TBL-58-1-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-1-1"
class="td11"><span
class="ptmr7t-x-x-90">(s) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-58-1-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">g</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">,</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">&hellip;</span><span
class="pcrr7t-x-x-90">,</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">g</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-2-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-2-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-2-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-3-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-3-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-3-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">g</span><sub><span
class="cmr-6">1</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="ptmr7t-x-x-90">&hellip;</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-4-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-4-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-4-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">g</span><sub><span
class="cmmi-6">n</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-5-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-5-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-5-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="ptmr7t-x-x-90">&hellip; </span></td></tr><tr
style="vertical-align:baseline;" id="TBL-58-6-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-6-1"
class="td
11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-6-2"
class="td11"> <span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-7-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-7-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-7-2"
class="td11"> <span
class="ptmr7t-x-x-90">where </span><span
class="cmmi-9">y </span><span
class="ptmr7t-x-x-90">is a new variable </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-58-8-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-8-1"
class="td11"> <span
class="ptmr7t-x-x-90">(t) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-58-8-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;&#x003C;-</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">0</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-9-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-9-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-9-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;case</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">0</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">p</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-10-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-10-1"
class="td11"><span
class="ptmr7t-x-x-90">(u) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-58-10-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;let</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">decls</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-11-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-11-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-11-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;let</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">decls</span><span
class="pcrr7t-x-x-90">&#x00A0;in</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-58-12-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-12-1"
class="td11"><span
class="ptmr7t-x-x-90">(v) </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-58-12-2"
class="td11"> <span
class="pcrr7t-x-x-90">case</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;of</span><span
class="pcrr7t-x-x-90">&#x00A0;{</span><span
class="pcrr7t-x-x-90">&#x00A0;()</span><span
class="pcrr7t-x-x-90">&#x00A0;|</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">0</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">;</span><span
class="pcrr7t-x-x-90">&#x00A0;_</span><span
class="pcrr7t-x-x-90">&#x00A0;-&#x003E;</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime;</span><span
class="pcrr7t-x-x-90">&#x00A0;}</span> </td>
</tr><tr
style="vertical-align:baseline;" id="TBL-58-13-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-13-1"
class="td11"> </td><td style="white-space:nowrap; text-align:left;" id="TBL-58-13-2"
class="td11"> <span
class="cmr-9">=</span><span
class="pcrr7t-x-x-90">&#x00A0;if</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><sub><span
class="cmr-6">0</span></sub><span
class="pcrr7t-x-x-90">&#x00A0;then</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="pcrr7t-x-x-90">&#x00A0;else</span><span
class="pcrr7t-x-x-90">&#x00A0;</span><span
class="cmmi-9">e</span><span
class="cmsy-9">&prime; </span></td>
</tr><tr
class="vspace" style="font-size:4.0pt"><td
>&nbsp;</td><td
>&nbsp;</td></tr><tr
style="vertical-align:baseline;" id="TBL-58-14-"><td style="white-space:nowrap; text-align:center;" id="TBL-58-14-1"
class="td11"> </td></tr></table></div> </div></div>
</div>
<br /><div class="caption"
><span class="id">Figure&#x00A0;3.3: </span><span
class="content">Semantics of Case Expressions, Part 3</span></div><!--tex4ht:label?: x8-610033 -->
</div><hr class="endfigure" />
<p class="noindent"> In Figures&#x00A0;<a
href="#x8-610011">3.1<!--tex4ht:ref: simple-case-expr-1 --></a>&#8211;<a
href="#x8-610033">3.3<!--tex4ht:ref: simple-case-expr-3 --></a>: <span
class="cmmi-10">e</span>, <span
class="cmmi-10">e</span><span
class="cmsy-10">&prime;</span> and <span
class="cmmi-10">e</span><sub><span
class="cmmi-7">i</span></sub> are expressions; <span
class="cmmi-10">g</span><sub><span
class="cmmi-7">i</span></sub> and <span
class="cmmi-10">gs</span><sub><span
class="cmmi-7">i</span></sub> are guards and sequences of guards respecively; <span
class="cmmi-10">p</span> and <span
class="cmmi-10">p</span><sub><span
class="cmmi-7">i</span></sub>
are patterns; <span
class="cmmi-10">v</span>, <span
class="cmmi-10">x</span>, and <span
class="cmmi-10">x</span><sub><span
class="cmmi-7">i</span></sub> are variables; <span
class="cmmi-10">K</span> and <span
class="cmmi-10">K</span><span
class="cmsy-10">&prime;</span> are algebraic datatype (<span
class="pcrr7t-">data</span>) constructors (including tuple
constructors); and <span
class="cmmi-10">N</span> is a <span
class="pcrr7t-">newtype</span> constructor<a
id="dx8-61004"></a>.
<p class="noindent"> Rule&#x00A0;(b) matches a general source-language <span
class="pcrr7t-">case</span> expression, regardless of whether it actually includes guards&#8212;if
no guards are written, then <span
class="pcrr7t-">True</span> is substituted for the guards <span
class="cmmi-10">gs</span><sub><span
class="cmmi-7">i,j</span></sub> in the <span
class="cmmi-10">match</span><sub><span
class="cmmi-7">i</span></sub> forms. Subsequent identities
manipulate the resulting <span
class="pcrr7t-">case</span> expression into simpler and simpler forms.
<p class="noindent"> Rule&#x00A0;(h) in Figure&#x00A0;<a
href="#x8-610022">3.2<!--tex4ht:ref: simple-case-expr-2 --></a> involves the overloaded operator <span
class="pcrr7t-">==</span>; it is this rule that defines the meaning of pattern
matching against overloaded constants. <a
id="dx8-61005"></a>
<p class="noindent"> These identities all preserve the static semantics. Rules&#x00A0;(d), (e), (j), and&#x00A0;(q) use a lambda rather than a <span
class="pcrr7t-">let</span>; this
indicates that variables bound by <span
class="pcrr7t-">case</span> are monomorphically typed (Section&#x00A0;<a
href="haskellch4.html#x10-670004.1.4">4.1.4<!--tex4ht:ref: type-semantics --></a>). <a
id="dx8-61006"></a>
<!--l. 7--><div class="crosslinks"><p class="noindent">[<a
href="haskellch4.html" >next</a>] [<a
href="haskellch2.html" >prev</a>] [<a
href="haskellch2.html#tailhaskellch2.html" >prev-tail</a>] [<a
href="haskellch3.html" >front</a>] [<a
href="haskellpa1.html#haskellch3.html" >up</a>] </p></div>
<p class="noindent"> <a
id="tailhaskellch3.html"></a>
</body></html>