Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / OptionalArguments
CommitLineData
7f918cf1
CE
1<!DOCTYPE html>\r
2<html lang="en">\r
3<head>\r
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\r
5<meta name="generator" content="AsciiDoc 8.6.9">\r
6<title>OptionalArguments</title>\r
7<link rel="stylesheet" href="./asciidoc.css" type="text/css">\r
8<link rel="stylesheet" href="./pygments.css" type="text/css">\r
9\r
10\r
11<script type="text/javascript" src="./asciidoc.js"></script>\r
12<script type="text/javascript">\r
13/*<![CDATA[*/\r
14asciidoc.install();\r
15/*]]>*/\r
16</script>\r
17<link rel="stylesheet" href="./mlton.css" type="text/css">\r
18</head>\r
19<body class="article">\r
20<div id="banner">\r
21<div id="banner-home">\r
22<a href="./Home">MLton 20180207</a>\r
23</div>\r
24</div>\r
25<div id="header">\r
26<h1>OptionalArguments</h1>\r
27</div>\r
28<div id="content">\r
29<div id="preamble">\r
30<div class="sectionbody">\r
31<div class="paragraph"><p><a href="StandardML">Standard ML</a> does not have built-in support for optional\r
32arguments. Nevertheless, using <a href="Fold">Fold</a>, it is easy to define\r
33functions that take optional arguments.</p></div>\r
34<div class="paragraph"><p>For example, suppose that we have the following definition of a\r
35function <span class="monospaced">f</span>.</p></div>\r
36<div class="listingblock">\r
37<div class="content"><div class="highlight"><pre><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
38<span class="w"> </span><span class="n">concat</span><span class="w"> </span><span class="p">[</span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;, &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">Real</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">r</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;, &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">]</span><span class="w"></span>\r
39</pre></div></div></div>\r
40<div class="paragraph"><p>Using the <span class="monospaced">OptionalArg</span> structure described below, we can define a\r
41function <span class="monospaced">f'</span>, an optionalized version of <span class="monospaced">f</span>, that takes 0, 1, 2, or\r
423 arguments. Embedded within <span class="monospaced">f'</span> will be default values for <span class="monospaced">i</span>,\r
43<span class="monospaced">r</span>, and <span class="monospaced">s</span>. If <span class="monospaced">f'</span> gets no arguments, then all the defaults are\r
44used. If <span class="monospaced">f'</span> gets one argument, then that will be used for <span class="monospaced">i</span>. Two\r
45arguments will be used for <span class="monospaced">i</span> and <span class="monospaced">r</span> respectively. Three arguments\r
46will override all default values. Calls to <span class="monospaced">f'</span> will look like the\r
47following.</p></div>\r
48<div class="listingblock">\r
49<div class="content"><div class="highlight"><pre><span class="n">f&#39;</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
50<span class="n">f&#39;</span><span class="w"> </span><span class="n">`</span><span class="mi">2</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
51<span class="n">f&#39;</span><span class="w"> </span><span class="n">`</span><span class="mi">2</span><span class="w"> </span><span class="n">`</span><span class="mf">3.0</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
52<span class="n">f&#39;</span><span class="w"> </span><span class="n">`</span><span class="mi">2</span><span class="w"> </span><span class="n">`</span><span class="mf">3.0</span><span class="w"> </span><span class="n">`</span><span class="s">&quot;four&quot;</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
53</pre></div></div></div>\r
54<div class="paragraph"><p>The optional argument indicator, <span class="monospaced">&grave;</span>, is not special syntax ---\r
55it is a normal SML value, defined in the <span class="monospaced">OptionalArg</span> structure\r
56below.</p></div>\r
57<div class="paragraph"><p>Here is the definition of <span class="monospaced">f'</span> using the <span class="monospaced">OptionalArg</span> structure, in\r
58particular, <span class="monospaced">OptionalArg.make</span> and <span class="monospaced">OptionalArg.D</span>.</p></div>\r
59<div class="listingblock">\r
60<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">f&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
61<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
62<span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">OptionalArg</span><span class="w"> </span><span class="k">in</span><span class="w"></span>\r
63<span class="w"> </span><span class="n">make</span><span class="w"> </span><span class="p">(</span><span class="n">D</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">D</span><span class="w"> </span><span class="mf">2.0</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">D</span><span class="w"> </span><span class="s">&quot;three&quot;</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
64<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">))</span><span class="w"></span>\r
65<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
66</pre></div></div></div>\r
67<div class="paragraph"><p>The definition of <span class="monospaced">f'</span> is eta expanded as with all uses of fold. A\r
68call to <span class="monospaced">OptionalArg.make</span> is supplied with a variable number of\r
69defaults (in this case, three), the end-of-arguments terminator, <span class="monospaced">$</span>,\r
70and the function to run, taking its arguments as an n-ary\r
71<a href="ProductType">product</a>. In this case, the function simply converts\r
72the product to an ordinary tuple and calls <span class="monospaced">f</span>. Often, the function\r
73body will simply be written directly.</p></div>\r
74<div class="paragraph"><p>In general, the definition of an optional-argument function looks like\r
75the following.</p></div>\r
76<div class="listingblock">\r
77<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
78<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
79<span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">OptionalArg</span><span class="w"> </span><span class="k">in</span><span class="w"></span>\r
80<span class="w"> </span><span class="n">make</span><span class="w"> </span><span class="p">(</span><span class="n">D</span><span class="w"> </span><span class="n">&lt;default1&gt;</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">D</span><span class="w"> </span><span class="n">&lt;default2&gt;</span><span class="p">)</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">(</span><span class="n">D</span><span class="w"> </span><span class="n">&lt;defaultn&gt;</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
81<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">x1</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">x2</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">xn</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
82<span class="w"> </span><span class="n">&lt;function</span><span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="n">goes</span><span class="w"> </span><span class="n">here&gt;</span><span class="p">)</span><span class="w"></span>\r
83<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
84</pre></div></div></div>\r
85<div class="paragraph"><p>Here is the definition of <span class="monospaced">OptionalArg</span>.</p></div>\r
86<div class="listingblock">\r
87<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">OptionalArg</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
88<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
89<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">make</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
90<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
91<span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">fold</span><span class="w"></span>\r
92<span class="w"> </span><span class="p">((</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="p">),</span><span class="w"></span>\r
93<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">func</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
94<span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">fold</span><span class="w"> </span><span class="p">((</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="p">()),</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="n">d</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
95<span class="w"> </span><span class="k">let</span><span class="w"></span>\r
96<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">d</span><span class="p">)</span><span class="w"></span>\r
97<span class="w"> </span><span class="k">in</span><span class="w"></span>\r
98<span class="w"> </span><span class="n">func</span><span class="w"> </span><span class="n">d</span><span class="w"></span>\r
99<span class="w"> </span><span class="k">end</span><span class="p">))</span><span class="w"></span>\r
100<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
101\r
102<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">D</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">step0</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
103<span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">ds</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">d</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">ds</span><span class="p">),</span><span class="w"></span>\r
104<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">)))</span><span class="w"></span>\r
105\r
106<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">`</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
107<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
108<span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">step1</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">d</span><span class="p">))</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">d</span><span class="p">),</span><span class="w"> </span><span class="n">d</span><span class="p">))</span><span class="w"></span>\r
109<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
110<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
111</pre></div></div></div>\r
112<div class="paragraph"><p><span class="monospaced">OptionalArg.make</span> uses a nested fold. The first <span class="monospaced">fold</span> accumulates\r
113the default values in a product, associated to the right, and a\r
114reversal function that converts a product (of the same arity as the\r
115number of defaults) from right associativity to left associativity.\r
116The accumulated defaults are used by the second fold, which recurs\r
117over the product, replacing the appropriate component as it encounters\r
118optional arguments. The second fold also constructs a "fill"\r
119function, <span class="monospaced">f</span>, that is used to reconstruct the product once the\r
120end-of-arguments is reached. Finally, the finisher reconstructs the\r
121product and uses the reversal function to convert the product from\r
122right associative to left associative, at which point it is passed to\r
123the user-supplied function.</p></div>\r
124<div class="paragraph"><p>Much of the complexity comes from the fact that while recurring over a\r
125product from left to right, one wants it to be right-associative,\r
126e.g., look like</p></div>\r
127<div class="listingblock">\r
128<div class="content"><div class="highlight"><pre><span class="n">a</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="w"> </span><span class="n">&amp;</span><span class="w"> </span><span class="n">d</span><span class="p">))</span><span class="w"></span>\r
129</pre></div></div></div>\r
130<div class="paragraph"><p>but the user function in the end wants the product to be left\r
131associative, so that the product argument pattern can be written\r
132without parentheses (since <span class="monospaced">&amp;</span> is left associative).</p></div>\r
133</div>\r
134</div>\r
135<div class="sect1">\r
136<h2 id="_labelled_optional_arguments">Labelled optional arguments</h2>\r
137<div class="sectionbody">\r
138<div class="paragraph"><p>In addition to the positional optional arguments described above, it\r
139is sometimes useful to have labelled optional arguments. These allow\r
140one to define a function, <span class="monospaced">f</span>, with defaults, say <span class="monospaced">a</span> and <span class="monospaced">b</span>. Then,\r
141a caller of <span class="monospaced">f</span> can supply values for <span class="monospaced">a</span> and <span class="monospaced">b</span> by name. If no\r
142value is supplied then the default is used.</p></div>\r
143<div class="paragraph"><p>Labelled optional arguments are a simple extension of\r
144<a href="FunctionalRecordUpdate">FunctionalRecordUpdate</a> using post composition. Suppose, for\r
145example, that one wants a function <span class="monospaced">f</span> with labelled optional\r
146arguments <span class="monospaced">a</span> and <span class="monospaced">b</span> with default values <span class="monospaced">0</span> and <span class="monospaced">0.0</span> respectively.\r
147If one has a functional-record-update function <span class="monospaced">updateAB</span> for records\r
148with <span class="monospaced">a</span> and <span class="monospaced">b</span> fields, then one can define <span class="monospaced">f</span> in the following way.</p></div>\r
149<div class="listingblock">\r
150<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
151<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
152<span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">post</span><span class="w"></span>\r
153<span class="w"> </span><span class="p">(</span><span class="n">updateAB</span><span class="w"> </span><span class="p">{</span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mf">0.0</span><span class="p">},</span><span class="w"></span>\r
154<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">{</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">}</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="n">concat</span><span class="w"> </span><span class="p">[</span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="s">&quot; &quot;</span><span class="p">,</span><span class="w"></span>\r
155<span class="w"> </span><span class="n">Real</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">]))</span><span class="w"></span>\r
156<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
157</pre></div></div></div>\r
158<div class="paragraph"><p>The idea is that <span class="monospaced">f</span> is the post composition (using <span class="monospaced">Fold.post</span>) of\r
159the actual code for the function with a functional-record updater that\r
160starts with the defaults.</p></div>\r
161<div class="paragraph"><p>Here are some example calls to <span class="monospaced">f</span>.</p></div>\r
162<div class="listingblock">\r
163<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
164<span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">a</span><span class="w"> </span><span class="mi">13</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
165<span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">a</span><span class="w"> </span><span class="mi">13</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">b</span><span class="w"> </span><span class="mf">17.5</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
166<span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">b</span><span class="w"> </span><span class="mf">17.5</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">a</span><span class="w"> </span><span class="mi">13</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
167</pre></div></div></div>\r
168<div class="paragraph"><p>Notice that a caller can supply neither of the arguments, either of\r
169the arguments, or both of the arguments, and in either order. All\r
170that matter is that the arguments be labelled correctly (and of the\r
171right type, of course).</p></div>\r
172<div class="paragraph"><p>Here is another example.</p></div>\r
173<div class="listingblock">\r
174<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
175<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
176<span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">post</span><span class="w"></span>\r
177<span class="w"> </span><span class="p">(</span><span class="n">updateBCD</span><span class="w"> </span><span class="p">{</span><span class="n">b</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&quot;&lt;&gt;&quot;</span><span class="p">},</span><span class="w"></span>\r
178<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">{</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">d</span><span class="p">}</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
179<span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="n">concat</span><span class="w"> </span><span class="p">[</span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="s">&quot; &quot;</span><span class="p">,</span><span class="w"></span>\r
180<span class="w"> </span><span class="n">Real</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="s">&quot; &quot;</span><span class="p">,</span><span class="w"></span>\r
181<span class="w"> </span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">]))</span><span class="w"></span>\r
182<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
183</pre></div></div></div>\r
184<div class="paragraph"><p>Here are some example calls.</p></div>\r
185<div class="listingblock">\r
186<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
187<span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">d</span><span class="w"> </span><span class="s">&quot;goodbye&quot;</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
188<span class="k">val</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">d</span><span class="w"> </span><span class="s">&quot;hello&quot;</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">b</span><span class="w"> </span><span class="mi">17</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">U</span><span class="p">#</span><span class="n">c</span><span class="w"> </span><span class="mf">19.3</span><span class="p">)</span><span class="w"> </span><span class="n">$</span><span class="w"></span>\r
189</pre></div></div></div>\r
190</div>\r
191</div>\r
192</div>\r
193<div id="footnotes"><hr></div>\r
194<div id="footer">\r
195<div id="footer-text">\r
196</div>\r
197<div id="footer-badges">\r
198</div>\r
199</div>\r
200</body>\r
201</html>\r