7601 lines
338 KiB
HTML
7601 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 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, “<span
|
||
|
class="pcrr7t-">concatMap</span>” used in the translation of list comprehensions
|
||
|
(Section <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
|
||
|
“<span
|
||
|
class="pcrr7t-">concatMap</span>” 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">→</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"> </span><span
|
||
|
class="pcrr7t-">::</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="cmmi-10">context</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">=></span><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> type</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>expression type 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-">  </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">→</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"> qop</span><span
|
||
|
class="cmmi-10"> infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-5-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>infix operator 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"> infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-6-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>prefix 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-">  </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">→</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"> apat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> apat</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-10-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>lambda abstraction<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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"> decls</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">in</span><span
|
||
|
class="cmmi-10"> exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-11-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>let 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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">then</span><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">else</span><span
|
||
|
class="cmmi-10"> exp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-12-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">of</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> alts</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-13-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>case 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"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> stmts</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-14-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>do 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">→</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"> aexp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-12-16-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>function 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-">  </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">→</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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>general 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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-22-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>parenthesized 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"> exp</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> exp</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-23-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>tuple<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> k </span><span
|
||
|
class="cmsy-10">≥ </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"> exp</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> exp</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-24-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>list<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> k </span><span
|
||
|
class="cmsy-10">≥ </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"> exp</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> exp</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">..</span><span
|
||
|
class="cmmi-10"> </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"> </span><span
|
||
|
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-25-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>arithmetic 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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">|</span><span
|
||
|
class="cmmi-10"> qual</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> qual</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-26-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>list comprehension<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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"> </span><span
|
||
|
class="cmmi-10">infixexp</span><span
|
||
|
class="cmmi-10"> qop</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-27-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>left 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"> </span><span
|
||
|
class="cmmi-10">qop</span><sub><span
|
||
|
class="cmsy-7">⟨</span><span
|
||
|
class="pcrr7t-">-</span><span
|
||
|
class="cmsy-7">⟩</span></sub><span
|
||
|
class="cmmi-10"> infixexp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-28-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>right 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"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-29-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>labeled construction<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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">⟨</span><span
|
||
|
class="cmmi-7">qcon</span><span
|
||
|
class="cmsy-7">⟩</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-12-30-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>labeled update<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n</span><span
|
||
|
class="cmmi-10">  </span><span
|
||
|
class="cmsy-10">≥</span> <span
|
||
|
class="cmmi-10"> </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-">  </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’s fixity (see Section <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 “<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"> y</span><span
|
||
|
class="cmmi-10"> 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"> z</span>” (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 “<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"> y</span>” or “<span
|
||
|
class="cmmi-10">y</span><span
|
||
|
class="cmmi-10"> 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"> z</span>” 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"> r</span>.
|
||
|
<p class="noindent"> An example algorithm for resolving expressions involving infix operators is given in Section <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 <a
|
||
|
href="haskellch4.html#x10-820004.4.2">4.4.2<!--tex4ht:ref: fixity --></a>, Figure <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-"> x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> g</span><span
|
||
|
class="pcrr7t-"> 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-"> x)</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> (g</span><span
|
||
|
class="pcrr7t-"> 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-"> f</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> 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-"> (f</span><span
|
||
|
class="pcrr7t-"> x))</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> 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-"> {</span><span
|
||
|
class="pcrr7t-"> ...</span><span
|
||
|
class="pcrr7t-"> }</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> 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-"> {</span><span
|
||
|
class="pcrr7t-"> ...</span><span
|
||
|
class="pcrr7t-"> }</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> (x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> 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-"> +</span><span
|
||
|
class="pcrr7t-"> let</span><span
|
||
|
class="pcrr7t-"> {</span><span
|
||
|
class="pcrr7t-"> ...</span><span
|
||
|
class="pcrr7t-"> }</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> 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-"> +</span><span
|
||
|
class="pcrr7t-"> (let</span><span
|
||
|
class="pcrr7t-"> {</span><span
|
||
|
class="pcrr7t-"> ...</span><span
|
||
|
class="pcrr7t-"> }</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> (x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> 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-"> x</span><span
|
||
|
class="pcrr7t-"> y</span><span
|
||
|
class="pcrr7t-"> ::</span><span
|
||
|
class="pcrr7t-"> 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-"> x</span><span
|
||
|
class="pcrr7t-"> y)</span><span
|
||
|
class="pcrr7t-"> ::</span><span
|
||
|
class="pcrr7t-"> 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-"> x</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> a+b</span><span
|
||
|
class="pcrr7t-"> ::</span><span
|
||
|
class="pcrr7t-"> 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-"> x</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> ((a+b)</span><span
|
||
|
class="pcrr7t-"> ::</span><span
|
||
|
class="pcrr7t-"> 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">⊥</span><a
|
||
|
id="dx8-23002"></a> (“bottom”<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">⊥</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     :: String -> a
|
||
|
 <br />undefined :: 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">→</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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>general 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">→</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-">  </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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">(</span><span
|
||
|
class="cmmi-10"> varsym</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-7-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">(</span><span
|
||
|
class="cmmi-10"> qvarsym</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-8-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>qualified 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">(</span><span
|
||
|
class="cmmi-10"> consym</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-9-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">(</span><span
|
||
|
class="cmmi-10"> gconsym</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-10-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>qualified 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> <span
|
||
|
class="cmmi-10"> varid</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-11-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>variable 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> <span
|
||
|
class="cmmi-10"> qvarid</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-12-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>qualified variable 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> <span
|
||
|
class="cmmi-10"> conid</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-13-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>constructor 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> <span
|
||
|
class="cmmi-10"> qconid</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">`</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-15-14-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>qualified constructor 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> conop </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-15-15-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> qconop </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-15-16-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>qualified 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> 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 <a
|
||
|
href="#x8-280003.4">3.4<!--tex4ht:ref: operators --></a>), or partially applied using a <span
|
||
|
class="ptmri7t-">section </span>(Section <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-"> x</span><span
|
||
|
class="pcrr7t-"> 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-"> 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 <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-"> x</span><span
|
||
|
class="pcrr7t-"> y</span> is equivalent to <span
|
||
|
class="pcrr7t-">x</span><span
|
||
|
class="pcrr7t-"> +</span><span
|
||
|
class="pcrr7t-"> y</span>, and <span
|
||
|
class="pcrr7t-">foldr</span><span
|
||
|
class="pcrr7t-"> (⋆)</span><span
|
||
|
class="pcrr7t-"> 1</span><span
|
||
|
class="pcrr7t-"> xs</span> is equivalent to <span
|
||
|
class="pcrr7t-">foldr</span><span
|
||
|
class="pcrr7t-"> (\x</span><span
|
||
|
class="pcrr7t-"> y</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x⋆y)</span><span
|
||
|
class="pcrr7t-"> 1</span><span
|
||
|
class="pcrr7t-"> 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 <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-"> 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∕d</span><span
|
||
|
class="cmmi-10">  </span><span
|
||
|
class="cmr-10">=</span> <span
|
||
|
class="cmmi-10"> 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">→</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"> aexp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-16-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>function 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">→</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"> apat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> apat</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-16-2-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>lambda abstraction<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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"> 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-"> x)</span><span
|
||
|
class="pcrr7t-"> 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"> p</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> 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->x</span>
|
||
|
is syntactically incorrect; it may legally be written as <span
|
||
|
class="pcrr7t-">\(x:xs)->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>—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"> p</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> 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"> x</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> x</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="pcrr7t-"> case</span><span
|
||
|
class="pcrr7t-"> (</span><span
|
||
|
class="cmmi-10">x</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> x</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="pcrr7t-">)</span><span
|
||
|
class="pcrr7t-"> of</span><span
|
||
|
class="pcrr7t-"> (</span><span
|
||
|
class="cmmi-10">p</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</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-"> -></span><span
|
||
|
class="cmmi-10"> 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 <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">⊥</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">→</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"> qop</span><span
|
||
|
class="cmmi-10"> 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"> </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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>prefix 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">→</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"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> qconop </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-18-4-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>qualified 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"> qop</span><span
|
||
|
class="cmmi-10"> 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-"> </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 <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-"> x</span><span
|
||
|
class="pcrr7t-"> y</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x-y)</span>, as with any infix operator, and does not denote
|
||
|
<span
|
||
|
class="pcrr7t-">(\</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> -x)</span>—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"> op</span><span
|
||
|
class="cmmi-10"> 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"> 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-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"> </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">→</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"> </span><span
|
||
|
class="cmmi-10">infixexp</span><span
|
||
|
class="cmmi-10"> qop</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-20-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>left 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"> </span><span
|
||
|
class="cmmi-10">qop</span><sub><span
|
||
|
class="cmsy-7">⟨</span><span
|
||
|
class="pcrr7t-">-</span><span
|
||
|
class="cmsy-7">⟩</span></sub><span
|
||
|
class="cmmi-10"> infixexp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-20-2-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>right 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"> op</span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> or <span
|
||
|
class="pcrr7t-">(</span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="cmmi-10"> op</span><span
|
||
|
class="cmmi-10"> </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"> e</span><span
|
||
|
class="pcrr7t-">)</span> is legal if and only if <span
|
||
|
class="pcrr7t-">(x</span><span
|
||
|
class="cmmi-10"> op</span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-">)</span> parses in the same
|
||
|
way as <span
|
||
|
class="pcrr7t-">(x</span><span
|
||
|
class="cmmi-10"> op</span><span
|
||
|
class="cmmi-10"> </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"> op</span><span
|
||
|
class="pcrr7t-">)</span>. For example, <span
|
||
|
class="pcrr7t-">(⋆a+b)</span> is syntactically invalid, but
|
||
|
<span
|
||
|
class="pcrr7t-">(+a⋆b)</span> and <span
|
||
|
class="pcrr7t-">(⋆(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">
|
||
|
  (let n = 10 in n +)
|
||
|
</div>
|
||
|
<p class="noindent"></div>
|
||
|
<p class="noindent"> is invalid because, by the let/lambda meta-rule (Section <a
|
||
|
href="#x8-220003">3<!--tex4ht:ref: expressions --></a>), the expression
|
||
|
<div class="quote">
|
||
|
|
||
|
|
||
|
|
||
|
<div class="verbatim" id="verbatim-8">
|
||
|
  (let n = 10 in n + x)
|
||
|
</div>
|
||
|
<p class="noindent"></div>
|
||
|
<p class="noindent"> parses as
|
||
|
<div class="quote">
|
||
|
|
||
|
|
||
|
|
||
|
<div class="verbatim" id="verbatim-9">
|
||
|
  (let n = 10 in (n + x))
|
||
|
</div>
|
||
|
<p class="noindent"></div>
|
||
|
<p class="noindent"> rather than
|
||
|
<div class="quote">
|
||
|
|
||
|
|
||
|
|
||
|
<div class="verbatim" id="verbatim-10">
|
||
|
  ((let n = 10 in n) + 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"> 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"> exp</span><span
|
||
|
class="pcrr7t-">)</span> is equivalent to the disallowed section. The expression <span
|
||
|
class="pcrr7t-">(+</span><span
|
||
|
class="pcrr7t-"> (-</span><span
|
||
|
class="cmmi-10"> 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"> 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"> x</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> x</span><span
|
||
|
class="cmmi-10"> op</span><span
|
||
|
class="cmmi-10"> 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"> 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"> x</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="cmmi-10"> op</span><span
|
||
|
class="cmmi-10"> 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">→</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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">then</span><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">else</span><span
|
||
|
class="cmmi-10"> 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"> e</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">then</span><span
|
||
|
class="cmmi-10"> e</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">else</span><span
|
||
|
class="cmmi-10"> 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">⊥</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"> e</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">then</span><span
|
||
|
class="cmmi-10"> e</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">else</span><span
|
||
|
class="cmmi-10"> 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"> e</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">of</span><span
|
||
|
class="pcrr7t-"> {</span><span
|
||
|
class="pcrr7t-"> True</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="cmmi-10"> e</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="pcrr7t-"> False</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="cmmi-10"> e</span><sub><span
|
||
|
class="cmr-7">3</span></sub><span
|
||
|
class="cmmi-10"> </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">→</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"> qop</span><span
|
||
|
class="cmmi-10"> 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">→</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"> exp</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> exp</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-24-2-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">k </span><span
|
||
|
class="cmsy-10">≥ </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">→</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">→</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"> gconsym</span><span
|
||
|
class="cmmi-10"> </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">→</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">→</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">→</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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> 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">≥ </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 <a
|
||
|
href="haskellch6.html#x13-1200006.1.3">6.1.3<!--tex4ht:ref: basic-lists --></a>, and Chapter <a
|
||
|
href="haskellch9.html#x16-1710009">9<!--tex4ht:ref: stdprelude --></a> notably
|
||
|
Section <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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> 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"> </span><span
|
||
|
class="pcrr7t-">:</span><span
|
||
|
class="pcrr7t-"> (</span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">:</span><span
|
||
|
class="pcrr7t-"> (</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">(</span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">:</span><span
|
||
|
class="pcrr7t-"> [])))</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 <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 <a
|
||
|
href="haskellch4.html#x10-650004.1.2">4.1.2<!--tex4ht:ref: type-syntax --></a>). </div></div>
|
||
|
</div>
|
||
|
<p class="noindent"> The constructor “<span
|
||
|
class="pcrr7t-">:</span>” 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 <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">→</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"> exp</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> exp</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-26-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">k </span><span
|
||
|
class="cmsy-10">≥ </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">→</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-">  </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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> 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">≥ </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>…<span
|
||
|
class="pcrr7t-">,)</span>, where there are <span
|
||
|
class="cmmi-10">n </span><span
|
||
|
class="cmsy-10">− </span><span
|
||
|
class="cmr-10">1</span> commas. Thus <span
|
||
|
class="pcrr7t-">(a,b,c)</span> and <span
|
||
|
class="pcrr7t-">(,,)</span><span
|
||
|
class="pcrr7t-"> a</span><span
|
||
|
class="pcrr7t-"> b</span><span
|
||
|
class="pcrr7t-"> c</span> denote the same value. Standard
|
||
|
operations on tuples are given in the Prelude (see Section <a
|
||
|
href="haskellch6.html#x13-1210006.1.4">6.1.4<!--tex4ht:ref: basic-tuples --></a> and Chapter <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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> 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">≥ </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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> t</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="pcrr7t-">)</span> (see
|
||
|
Section <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">→</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"> exp</span><span
|
||
|
class="cmmi-10"> </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">→</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 <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">⊥</span>, and can be thought of as the “nullary tuple” (see
|
||
|
Section <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">→</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"> exp</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> exp</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">..</span><span
|
||
|
class="cmmi-10"> </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"> </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"> e</span><sub><span
|
||
|
class="cmr-7">2</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">..</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="pcrr7t-">..</span><span
|
||
|
class="pcrr7t-"> ]</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-"> </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-"> ]</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-"> </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-"> ]</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-"> </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-"> ]</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 <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 <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">→</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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">|</span><span
|
||
|
class="cmmi-10"> qual</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> qual</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-30-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>list comprehension<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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">→</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"> </span><span
|
||
|
class="pcrr7t-"><-</span><span
|
||
|
class="cmmi-10"> exp </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-30-2-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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"> decls </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-30-3-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>local 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>boolean 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"> e</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">|</span><span
|
||
|
class="cmmi-10"> q</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> q</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">]</span><span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10">n </span><span
|
||
|
class="cmsy-10">≥ </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"> </span><span
|
||
|
class="pcrr7t-"><-</span><span
|
||
|
class="cmmi-10"> e</span>, where <span
|
||
|
class="cmmi-10">p</span> is a pattern (see Section <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 <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">
|
||
|
[ x |  xs   <- [ [(1,2),(3,4)], [(5,4),(3,2)] ],
|
||
|
 <br />      (3,x) <- xs ]
|
||
|
</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-"> x</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> <-</span><span
|
||
|
class="pcrr7t-"> x,</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> <-</span><span
|
||
|
class="pcrr7t-"> x</span><span
|
||
|
class="pcrr7t-"> ]</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-"> z</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> y</span><span
|
||
|
class="pcrr7t-"> <-</span><span
|
||
|
class="pcrr7t-"> x,</span><span
|
||
|
class="pcrr7t-"> z</span><span
|
||
|
class="pcrr7t-"> <-</span><span
|
||
|
class="pcrr7t-"> 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-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> True</span><span
|
||
|
class="pcrr7t-"> ]</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-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">q</span><span
|
||
|
class="pcrr7t-"> ]</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"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">|</span><span
|
||
|
class="cmmi-10"> q</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="pcrr7t-"> True</span><span
|
||
|
class="pcrr7t-"> ]</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-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">b</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10"> Q</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10"> </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"> b</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">then</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">[</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">Q</span><span
|
||
|
class="pcrr7t-"> ]</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">else</span><span
|
||
|
class="pcrr7t-"> []</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-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-"><-</span><span
|
||
|
class="cmmi-10"> l</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10"> Q</span><span
|
||
|
class="pcrr7t-"> ]</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-"> ok</span><span
|
||
|
class="cmmi-10"> p</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">=</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">[</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">Q</span><span
|
||
|
class="pcrr7t-"> ]</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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> ok</span><span
|
||
|
class="pcrr7t-"> _</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> []</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-"> concatMap</span><span
|
||
|
class="pcrr7t-"> ok</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> let</span><span
|
||
|
class="cmmi-10"> decls</span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10"> Q</span><span
|
||
|
class="pcrr7t-"> ]</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"> decls</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">in</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">[</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="pcrr7t-"> |</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">Q</span><span
|
||
|
class="pcrr7t-"> ]</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-"><-</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">→</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"> decls</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">in</span><span
|
||
|
class="cmmi-10"> 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-"> {</span><span
|
||
|
class="cmmi-10"> d</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> d</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="cmmi-10"> 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 <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-"> (x,y)</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> undefined</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> </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-"> {</span><span
|
||
|
class="cmmi-10"> d</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> d</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="cmmi-10"> 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"> </span><span
|
||
|
class="pcrr7t-">=</span><span
|
||
|
class="cmmi-10"> 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 <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-"> {</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-"> </span> ... <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="cmmi-10">e</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="pcrr7t-">}</span><span
|
||
|
class="pcrr7t-"> 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-"> (~</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-"> =</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="pcrr7t-">,</span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="pcrr7t-">)</span><span
|
||
|
class="pcrr7t-"> 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-"> </span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmr-7">1</span></sub> <span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> </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-"> </span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="pcrr7t-"> of</span><span
|
||
|
class="pcrr7t-"> ~</span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> </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-"> </span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">e</span><sub><span
|
||
|
class="cmr-7">1</span></sub> <span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> </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-"> </span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> fix</span><span
|
||
|
class="pcrr7t-"> (</span><span
|
||
|
class="pcrr7t-"> \</span><span
|
||
|
class="pcrr7t-"> ~</span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> -></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="pcrr7t-"> 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 <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">→</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"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">of</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> alts</span><span
|
||
|
class="cmmi-10"> </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">→</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"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">n </span><span
|
||
|
class="cmsy-10">≥ </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">→</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"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">where</span><span
|
||
|
class="cmmi-10"> 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"> gdpat</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="pcrr7t-">where</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">empty</span><span
|
||
|
class="cmmi-10"> 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-">  </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">→</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"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="cmmi-10"> gdpat</span><span
|
||
|
class="cmmi-10"> </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">→</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"> guard</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">n </span><span
|
||
|
class="cmsy-10">≥ </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">→</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"> </span><span
|
||
|
class="pcrr7t-"><-</span><span
|
||
|
class="cmmi-10"> infixexp</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-10-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>pattern 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"> decls</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-36-11-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>local 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>boolean 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"> e</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">of</span><span
|
||
|
class="pcrr7t-"> {</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">p</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> match</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> match</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </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"> </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-">-></span><span
|
||
|
class="cmmi-10"> 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">…</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"> </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-">-></span><span
|
||
|
class="cmmi-10"> 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"> 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 “<span
|
||
|
class="pcrr7t-">|</span>” 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"> 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"> </span><span
|
||
|
class="pcrr7t-"><-</span><span
|
||
|
class="cmmi-10"> e</span>, where <span
|
||
|
class="cmmi-10">p</span> is a pattern
|
||
|
(see Section <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"> 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-"> <-</span><span
|
||
|
class="pcrr7t-"> </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"> </span><span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">where</span><span
|
||
|
class="cmmi-10"> 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"> </span><span
|
||
|
class="pcrr7t-">|</span><span
|
||
|
class="pcrr7t-"> True</span> </div></td><td style="white-space:nowrap; text-align:left;"
|
||
|
><div class="td11"> <span
|
||
|
class="pcrr7t-">-></span><span
|
||
|
class="cmmi-10"> 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"> 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">⊥</span>. Pattern matching is described in Section <a
|
||
|
href="#x8-580003.17">3.17<!--tex4ht:ref: pattern-matching --></a>, with the formal
|
||
|
semantics of case expressions in Section <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">
|
||
|
  case x of { (a,_) | let b = not a in b :: Bool -> a }
|
||
|
</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">
|
||
|
  case x of { (a,_) | (let b = not a in b :: Bool) -> a }
|
||
|
</div>
|
||
|
<p class="noindent"></div>
|
||
|
<p class="noindent"> However, the phrase <span
|
||
|
class="pcrr7t-">Bool</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> 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 — 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">→</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"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> stmts</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-39-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>do 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">→</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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> stmt</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">n </span><span
|
||
|
class="cmsy-10">≥ </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">→</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"> </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"> </span><span
|
||
|
class="pcrr7t-"><-</span><span
|
||
|
class="cmmi-10"> exp</span><span
|
||
|
class="cmmi-10"> </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"> decls</span><span
|
||
|
class="cmmi-10"> </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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">empty</span><span
|
||
|
class="cmmi-10"> 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">
|
||
|
  putStr "x: "    >>
|
||
|
 <br />  getLine         >>= \l ->
|
||
|
 <br />  return (words 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">
|
||
|
  do putStr "x: "
|
||
|
 <br />     l <- getLine
|
||
|
 <br />     return (words 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-"> {</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-"> {</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-">>></span><span
|
||
|
class="pcrr7t-"> do</span><span
|
||
|
class="pcrr7t-"> {</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-"> {</span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> <-</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">e</span><span
|
||
|
class="pcrr7t-">;</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-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-"> ok</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">p</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> do</span><span
|
||
|
class="pcrr7t-"> {</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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> ok</span><span
|
||
|
class="pcrr7t-"> _</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> fail</span><span
|
||
|
class="pcrr7t-"> "..."</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-"> </span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">e</span><span
|
||
|
class="pcrr7t-"> >>=</span><span
|
||
|
class="pcrr7t-"> 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-"> {let</span> <span
|
||
|
class="cmmi-10">decls</span><span
|
||
|
class="pcrr7t-">;</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-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-"> do</span><span
|
||
|
class="pcrr7t-"> {</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-">>></span>, <span
|
||
|
class="pcrr7t-">>>=</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-"><-</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 <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">
|
||
|
  data S = S1 { x :: Int } | S2 { x :: Int }   -- OK
|
||
|
 <br />  data T = T1 { y :: Int } | T2 { y :: Bool }  -- 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">→</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 <a
|
||
|
href="#x8-520003.15.2">3.15.2<!--tex4ht:ref: record-construction --></a>) and update (Section <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-"> 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-"> x</span><span
|
||
|
class="pcrr7t-"> of</span><span
|
||
|
class="pcrr7t-"> {</span> <span
|
||
|
class="cmmi-10">C</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmr-7">11</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmr-7">1</span><span
|
||
|
class="cmmi-7">k</span></sub> <span
|
||
|
class="pcrr7t-"> -></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">…</span> <span
|
||
|
class="pcrr7t-">;</span> <span
|
||
|
class="cmmi-10">C</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmmi-7">n</span><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> p</span><sub><span
|
||
|
class="cmmi-7">nk</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> </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"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> 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">→</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"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-43-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>labeled construction<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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">→</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"> </span><span
|
||
|
class="pcrr7t-">=</span><span
|
||
|
class="cmmi-10"> 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">⊥</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 <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-"> {}</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 — see the fourth bullet above); it denotes <span
|
||
|
class="pcrr7t-">F</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmsy-10">⊥</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmsy-10">⊥</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"> </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"> bs</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">undefined</span><span
|
||
|
class="cmr-10">)</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </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"> bs</span><span
|
||
|
class="cmmi-10"> </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"> bs</span><span
|
||
|
class="cmmi-10"> 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"> bs</span><span
|
||
|
class="cmmi-10"> 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"> bs</span><span
|
||
|
class="cmmi-10"> 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">→</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">⟨</span><span
|
||
|
class="cmmi-7">qcon</span><span
|
||
|
class="cmsy-7">⟩</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> fbind</span><sub><span
|
||
|
class="cmmi-7">n</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-45-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>labeled update<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> n </span><span
|
||
|
class="cmsy-10">≥ </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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">C</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmmi-7">k</span><sub><span
|
||
|
class="cmr-5">1</span></sub></sub> <span
|
||
|
class="pcrr7t-">-></span> <span
|
||
|
class="cmmi-10">C</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </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"> bs</span><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmr-10">)</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </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"> bs</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10">C</span><sub><span
|
||
|
class="cmmi-7">j</span></sub><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmmi-7">k</span><sub><span
|
||
|
class="cmmi-5">j</span></sub></sub> <span
|
||
|
class="pcrr7t-">-></span> <span
|
||
|
class="cmmi-10">C</span><sub><span
|
||
|
class="cmmi-7">j</span></sub><span
|
||
|
class="cmmi-10"> </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"> bs</span><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmr-10">)</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </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"> bs</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> _</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> error</span><span
|
||
|
class="pcrr7t-"> "Update</span><span
|
||
|
class="pcrr7t-"> 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">…</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 T    = C1 {f1,f2 :: Int}
|
||
|
 <br />          | C2 {f1 :: Int,
|
||
|
 <br />                f3,f4 :: 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-"> {f1</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> 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-"> 3</span><span
|
||
|
class="pcrr7t-"> 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-"> {f1</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> 1,</span><span
|
||
|
class="pcrr7t-"> f4</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> 'A',</span><span
|
||
|
class="pcrr7t-"> f3</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> '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-"> 1</span><span
|
||
|
class="pcrr7t-"> 'B'</span><span
|
||
|
class="pcrr7t-"> '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-"> {f1</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> 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-"> x</span><span
|
||
|
class="pcrr7t-"> of</span><span
|
||
|
class="pcrr7t-"> C1</span><span
|
||
|
class="pcrr7t-"> _</span><span
|
||
|
class="pcrr7t-"> f2</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> C1</span><span
|
||
|
class="pcrr7t-"> 1</span><span
|
||
|
class="pcrr7t-"> 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-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> C2</span><span
|
||
|
class="pcrr7t-"> _</span><span
|
||
|
class="pcrr7t-"> f3</span><span
|
||
|
class="pcrr7t-"> f4</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> C2</span><span
|
||
|
class="pcrr7t-"> 1</span><span
|
||
|
class="pcrr7t-"> f3</span><span
|
||
|
class="pcrr7t-"> 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-"> {f2</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> 1,</span><span
|
||
|
class="pcrr7t-"> f3</span><span
|
||
|
class="pcrr7t-"> =</span><span
|
||
|
class="pcrr7t-"> '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">→</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"> </span><span
|
||
|
class="pcrr7t-">::</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="cmmi-10">context</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">=></span><span
|
||
|
class="cmr-10">]</span><span
|
||
|
class="cmmi-10"> 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"> </span><span
|
||
|
class="pcrr7t-">::</span><span
|
||
|
class="cmmi-10"> t</span>, where <span
|
||
|
class="cmmi-10">e</span> is an expression and <span
|
||
|
class="cmmi-10">t</span> is a type (Section <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 <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 <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"> </span><span
|
||
|
class="pcrr7t-">::</span><span
|
||
|
class="cmmi-10"> 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-"> {</span><span
|
||
|
class="cmmi-10"> v</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">::</span><span
|
||
|
class="cmmi-10"> t</span><span
|
||
|
class="pcrr7t-">;</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmmi-10"> v</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">=</span><span
|
||
|
class="cmmi-10"> e</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span><span
|
||
|
class="pcrr7t-"> in</span><span
|
||
|
class="pcrr7t-"> </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">→</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"> qconop</span><span
|
||
|
class="cmmi-10"> pat</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-1-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>infix 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-">  </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">→</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"> </span><span
|
||
|
class="cmr-10">(</span><span
|
||
|
class="cmmi-10">integer</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmsy-10">|</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>negative 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"> apat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>arity<span
|
||
|
class="cmmi-10"> gcon</span><span
|
||
|
class="cmmi-10">  </span><span
|
||
|
class="cmr-10">=</span> <span
|
||
|
class="cmmi-10"> k,</span><span
|
||
|
class="cmmi-10"> k </span><span
|
||
|
class="cmsy-10">≥ </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-">  </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">→</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"> </span><span
|
||
|
class="cmr-10">[</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmr-10">@</span><span
|
||
|
class="cmmi-10"> 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>as 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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>arity<span
|
||
|
class="cmmi-10"> gcon</span><span
|
||
|
class="cmmi-10">  </span><span
|
||
|
class="cmr-10">=</span> <span
|
||
|
class="cmmi-10"> </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"> </span><span
|
||
|
class="pcrr7t-">{</span><span
|
||
|
class="cmmi-10"> fpat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> fpat</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">}</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-12-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>labeled pattern<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> k </span><span
|
||
|
class="cmsy-10">≥ </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-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </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"> pat</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-15-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>parenthesized 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"> pat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> pat</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">)</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-16-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>tuple pattern<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> k </span><span
|
||
|
class="cmsy-10">≥ </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"> pat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">,</span><span
|
||
|
class="cmmi-10"> pat</span><sub><span
|
||
|
class="cmmi-7">k</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">]</span> </td><td style="white-space:nowrap; text-align:left;" id="TBL-50-17-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>list pattern<span
|
||
|
class="cmmi-10">,</span><span
|
||
|
class="cmmi-10"> k </span><span
|
||
|
class="cmsy-10">≥ </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"> apat </span></td><td style="white-space:nowrap; text-align:left;" id="TBL-50-18-4"
|
||
|
class="td11"> <span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="ptmri7t-"> </span><span
|
||
|
class="cmr-10">(</span>irrefutable 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-">  </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">→</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"> </span><span
|
||
|
class="pcrr7t-">=</span><span
|
||
|
class="cmmi-10"> 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>—no variable may appear more than once. For example, this definition is illegal:
|
||
|
<div class="quote">
|
||
|
|
||
|
|
||
|
|
||
|
<div class="verbatim" id="verbatim-18">
|
||
|
f (x,x) = x     -- ILLEGAL; x used twice in 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 e of { xs@(x:rest) -> if x==0 then rest else xs }
|
||
|
</div>
|
||
|
<p class="noindent"></div>
|
||
|
<p class="noindent"> is equivalent to:
|
||
|
<div class="quote">
|
||
|
|
||
|
|
||
|
|
||
|
<div class="verbatim" id="verbatim-20">
|
||
|
let { xs = e } in
|
||
|
 <br />  case xs of { (x:rest) -> if x==0 then rest else xs }
|
||
|
</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 e of { [x,_,_]  ->  if x==0 then True else False }
|
||
|
</div>
|
||
|
<p class="noindent"></div>
|
||
|
<p class="noindent"> is equivalent to:
|
||
|
<div class="quote">
|
||
|
|
||
|
|
||
|
|
||
|
<div class="verbatim" id="verbatim-22">
|
||
|
case e of { [x,y,z]  ->  if x==0 then True else False }
|
||
|
</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. return <span
|
||
|
class="cmsy-10">⊥</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">⊥</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"> 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"> 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">⊥</span>, then <span
|
||
|
class="cmmi-10">pat</span> is matched against <span
|
||
|
class="cmsy-10">⊥</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"> pat</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> 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"> v</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> 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">′</span><span
|
||
|
class="cmmi-10"> v</span><sub><span
|
||
|
class="cmr-7">1</span></sub><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10">…</span><span
|
||
|
class="cmmi-10"> 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">′</span>, the match
|
||
|
fails.
|
||
|
</li>
|
||
|
<li class="itemize">If the value is <span
|
||
|
class="cmsy-10">⊥</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"> </span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="pcrr7t-">==</span><span
|
||
|
class="cmmi-10"> </span><span
|
||
|
class="cmmi-10"> 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 <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">⊥</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">⊥</span>
|
||
|
the match diverges. The irrefutable patterns are as follows: a variable, a wildcard, <span
|
||
|
class="cmmi-10">N</span><span
|
||
|
class="cmmi-10"> 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 <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">⊥</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">⊥</span><span
|
||
|
class="pcrr7t-">,'x']</span>, then attempting to
|
||
|
match <span
|
||
|
class="pcrr7t-">'a'</span> against <span
|
||
|
class="cmsy-10">⊥</span> causes the match to <span
|
||
|
class="cmmi-10">diverge</span>.
|
||
|
</li>
|
||
|
<li
|
||
|
class="enumerate" id="x8-60028x2">These examples demonstrate refutable vs. 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-"> ~(x,y)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> 0)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> 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-"> </span><span
|
||
|
class="pcrr7t-"> (x,y)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> 0)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥ </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-"> ~[x]</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> 0)</span><span
|
||
|
class="pcrr7t-"> []</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> 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-"> ~[x]</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x)</span><span
|
||
|
class="pcrr7t-"> []</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥ </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-"> ~[x,~(a,b)]</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x)</span><span
|
||
|
class="pcrr7t-"> [(0,1),</span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-">]</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> (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-"> ~[x,</span><span
|
||
|
class="pcrr7t-"> (a,b)]</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x)</span><span
|
||
|
class="pcrr7t-"> [(0,1),</span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-">]</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥ </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-"> </span><span
|
||
|
class="pcrr7t-"> (x:xs)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x:x:xs)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥ </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-"> ~(x:xs)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> x:x:xs)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-">:</span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-">:</span><span
|
||
|
class="cmsy-10">⊥ </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">
|
||
|
  newtype N = N Bool
|
||
|
 <br />  data    D = D !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-"> </span><span
|
||
|
class="pcrr7t-"> (N</span><span
|
||
|
class="pcrr7t-"> True)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> True)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</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-"> </span><span
|
||
|
class="pcrr7t-"> (D</span><span
|
||
|
class="pcrr7t-"> True)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> True)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</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-"> ~(D</span><span
|
||
|
class="pcrr7t-"> True)</span><span
|
||
|
class="pcrr7t-"> -></span><span
|
||
|
class="pcrr7t-"> True)</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⊥</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="cmsy-10">⇒</span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> </span><span
|
||
|
class="pcrr7t-"> True</span> </td></tr></table>
|
||
|
</div>
|
||
|
<p class="noindent"> Additional examples may be found in Section <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 <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 :: (Int,Int,Int) -> [Int] -> Int
|
||
|
 <br />f ~(x,y,z) [a] | (a == y) = 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 <a
|
||
|
href="#x8-610011">3.1<!--tex4ht:ref: simple-case-expr-1 --></a>–<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"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">alts</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> (\</span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">alts</span><span
|
||
|
class="pcrr7t-x-x-90"> })</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span> <span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">p</span><sub>
|
||
|
<span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9"> match</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> ;</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9"> match</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-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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9"> match</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-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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9"> match</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="ptmr7t-x-x-90"> </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> error</span><span
|
||
|
class="pcrr7t-x-x-90"> "No</span><span
|
||
|
class="pcrr7t-x-x-90"> match"</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="cmmi-9">…</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"> </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> ;</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> ;</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> where</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">decls</span><sub><span
|
||
|
class="cmmi-6">i</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> }</span> </td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">gs</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> ;</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">gs</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> where</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">decls</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">y</span><span
|
||
|
class="pcrr7t-x-x-90"> -></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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> let</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">decls</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> 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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">gs</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">gs</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">y</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">y</span><span
|
||
|
class="pcrr7t-x-x-90"> }}</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
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> ~</span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> (\</span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub> <span
|
||
|
class="cmmi-9">…</span> <span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub> <span
|
||
|
class="pcrr7t-x-x-90">-></span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">)</span><span
|
||
|
class="pcrr7t-x-x-90"> (case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90">-></span> <span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> })</span><span
|
||
|
class="cmmi-9">…</span> <span
|
||
|
class="pcrr7t-x-x-90">(case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </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">…</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
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> (</span><span
|
||
|
class="pcrr7t-x-x-90"> \</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> )</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> ;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span> </td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e </span></td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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 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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="cmmi-9"> p</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="cmmi-9"> x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> ;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span> </td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:2.0pt"><td
|
||
|
> </td><td
|
||
|
> </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">…</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">…</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
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> if</span><span
|
||
|
class="pcrr7t-x-x-90"> (</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"> then</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> else</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′ </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
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span> </td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> (</span><span
|
||
|
class="pcrr7t-x-x-90"> \</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> )</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v </span></td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmmi-9">N v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">N</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">v</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmsy-9">⊥</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">N</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmsy-9">⊥</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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
|
||
|
> </td><td
|
||
|
> </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"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">K</span> <span
|
||
|
class="pcrr7t-x-x-90"> {</span> <span
|
||
|
class="cmmi-9">f</span><sub><span
|
||
|
class="cmr-6">1</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> =</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmr-6">1</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> ,</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">f</span><sub><span
|
||
|
class="cmr-6">2</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> =</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmr-6">2</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> ,</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span> <span
|
||
|
class="pcrr7t-x-x-90">}</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">y</span><span
|
||
|
class="pcrr7t-x-x-90"> -></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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span> <span
|
||
|
class="cmmi-9">f</span><sub><span
|
||
|
class="cmr-6">1</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> =</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmr-6">1</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> -></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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span> <span
|
||
|
class="cmmi-9">K</span> <span
|
||
|
class="pcrr7t-x-x-90"> {</span> <span
|
||
|
class="cmmi-9">f</span><sub><span
|
||
|
class="cmr-6">2</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> =</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">p</span><sub><span
|
||
|
class="cmr-6">2</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> ,</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span> <span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">y</span> <span
|
||
|
class="pcrr7t-x-x-90"> };</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">y</span> <span
|
||
|
class="pcrr7t-x-x-90"> }}</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">…</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
|
||
|
> </td><td
|
||
|
> </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"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">K</span> <span
|
||
|
class="pcrr7t-x-x-90"> {</span> <span
|
||
|
class="cmmi-9">f</span> <span
|
||
|
class="pcrr7t-x-x-90"> =</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">p</span> <span
|
||
|
class="pcrr7t-x-x-90">}</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">K p</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="cmmi-9"> p</span><sub><span
|
||
|
class="cmmi-6">n</span></sub> <span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">v</span> <span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">K</span> <span
|
||
|
class="pcrr7t-x-x-90">_</span><span
|
||
|
class="cmmi-9">…</span> <span
|
||
|
class="pcrr7t-x-x-90">_</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span> <span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span> <span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> (</span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′ </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">′ </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
|
||
|
> </td><td
|
||
|
> </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"> (</span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> (\</span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="cmmi-9"> x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">)</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="cmmi-9"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="cmmi-9"> 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
|
||
|
> </td><td
|
||
|
> </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"> </span><span
|
||
|
class="cmsy-9">⊥</span><span
|
||
|
class="ptmr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90">of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">K</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmr-6">1</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">x</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="ptmr7t-x-x-90"> </span><span
|
||
|
class="cmr-9">=</span><span
|
||
|
class="ptmr7t-x-x-90">  </span><span
|
||
|
class="cmsy-9">⊥ </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
|
||
|
> </td><td
|
||
|
> </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 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"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span><span
|
||
|
class="cmmi-9">…</span><span
|
||
|
class="pcrr7t-x-x-90">,</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">g</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span><span
|
||
|
class="ptmr7t-x-x-90">…</span><span
|
||
|
class="pcrr7t-x-x-90"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">g</span><sub><span
|
||
|
class="cmmi-6">n</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="ptmr7t-x-x-90">… </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"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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
|
||
|
> </td><td
|
||
|
> </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"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> <-</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">0</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> case</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">0</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">p</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> let</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">decls</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> let</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">decls</span><span
|
||
|
class="pcrr7t-x-x-90"> in</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e </span></td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> of</span><span
|
||
|
class="pcrr7t-x-x-90"> {</span><span
|
||
|
class="pcrr7t-x-x-90"> ()</span><span
|
||
|
class="pcrr7t-x-x-90"> |</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">0</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90">;</span><span
|
||
|
class="pcrr7t-x-x-90"> _</span><span
|
||
|
class="pcrr7t-x-x-90"> -></span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′</span><span
|
||
|
class="pcrr7t-x-x-90"> }</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"> if</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><sub><span
|
||
|
class="cmr-6">0</span></sub><span
|
||
|
class="pcrr7t-x-x-90"> then</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="pcrr7t-x-x-90"> else</span><span
|
||
|
class="pcrr7t-x-x-90"> </span><span
|
||
|
class="cmmi-9">e</span><span
|
||
|
class="cmsy-9">′ </span></td>
|
||
|
</tr><tr
|
||
|
class="vspace" style="font-size:4.0pt"><td
|
||
|
> </td><td
|
||
|
> </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 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 <a
|
||
|
href="#x8-610011">3.1<!--tex4ht:ref: simple-case-expr-1 --></a>–<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">′</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">′</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 (b) matches a general source-language <span
|
||
|
class="pcrr7t-">case</span> expression, regardless of whether it actually includes guards—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 (h) in Figure <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 (d), (e), (j), and (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 <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>
|