Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / Fold01N
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>Fold01N</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>Fold01N</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 common use pattern of <a href="Fold">Fold</a> is to define a variable-arity\r
32function that combines multiple arguments together using a binary\r
33function. It is slightly tricky to do this directly using fold,\r
34because of the special treatment required for the case of zero or one\r
35argument. Here is a structure, <span class="monospaced">Fold01N</span>, that solves the problem\r
36once and for all, and eases the definition of such functions.</p></div>\r
37<div class="listingblock">\r
38<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">Fold01N</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
39<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
40<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">fold</span><span class="w"> </span><span class="p">{</span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">,</span><span class="w"> </span><span class="n">zero</span><span class="p">}</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
41<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">finish</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">zero</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">),</span><span class="w"></span>\r
42<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="p">_,</span><span class="w"> </span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="p">_)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">finish</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="w"> </span><span class="p">()))</span><span class="w"></span>\r
43\r
44<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">step0</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="p">,</span><span class="w"> </span><span class="n">input</span><span class="p">}</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
45<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="w"> </span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="p">_,</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
46<span class="w"> </span><span class="p">(</span><span class="n">finish</span><span class="p">,</span><span class="w"></span>\r
47<span class="w"> </span><span class="n">finish</span><span class="p">,</span><span class="w"></span>\r
48<span class="w"> </span><span class="k">fn</span><span class="w"> </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">input</span><span class="p">,</span><span class="w"></span>\r
49<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">x&#39;</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">combine</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="w"> </span><span class="n">input</span><span class="p">,</span><span class="w"> </span><span class="n">x&#39;</span><span class="p">)))</span><span class="w"></span>\r
50\r
51<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">step1</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="p">}</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
52<span class="w"> </span><span class="n">step0</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">combine</span><span class="p">,</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">input</span><span class="p">}</span><span class="w"> </span><span class="n">z</span><span class="w"></span>\r
53<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
54</pre></div></div></div>\r
55<div class="paragraph"><p>If one has a value <span class="monospaced">zero</span>, and functions <span class="monospaced">start</span>, <span class="monospaced">c</span>, and <span class="monospaced">finish</span>,\r
56then one can define a variable-arity function <span class="monospaced">f</span> and stepper\r
57<span class="monospaced">&grave;</span> as follows.</p></div>\r
58<div class="listingblock">\r
59<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><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><span class="n">Fold01N</span><span class="p">.</span><span class="n">fold</span><span class="w"> </span><span class="p">{</span><span class="n">finish</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">start</span><span class="p">,</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">zero</span><span class="p">}</span><span class="w"> </span><span class="n">z</span><span class="w"></span>\r
60<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><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><span class="n">Fold01N</span><span class="p">.</span><span class="n">step1</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="w"> </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">z</span><span class="w"></span>\r
61</pre></div></div></div>\r
62<div class="paragraph"><p>One can then use the fold equation to prove the following equations.</p></div>\r
63<div class="listingblock">\r
64<div class="content"><div class="highlight"><pre><span class="n">f</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">zero</span><span class="w"></span>\r
65<span class="n">f</span><span class="w"> </span><span class="n">`a1</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">finish</span><span class="w"> </span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="n">a1</span><span class="p">)</span><span class="w"></span>\r
66<span class="n">f</span><span class="w"> </span><span class="n">`a1</span><span class="w"> </span><span class="n">`a2</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">finish</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="w"> </span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="n">a1</span><span class="p">,</span><span class="w"> </span><span class="n">a2</span><span class="p">))</span><span class="w"></span>\r
67<span class="n">f</span><span class="w"> </span><span class="n">`a1</span><span class="w"> </span><span class="n">`a2</span><span class="w"> </span><span class="n">`a3</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">finish</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="w"> </span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="n">a1</span><span class="p">,</span><span class="w"> </span><span class="n">a2</span><span class="p">),</span><span class="w"> </span><span class="n">a3</span><span class="p">))</span><span class="w"></span>\r
68<span class="p">...</span><span class="w"></span>\r
69</pre></div></div></div>\r
70<div class="paragraph"><p>For an example of <span class="monospaced">Fold01N</span>, see <a href="VariableArityPolymorphism">VariableArityPolymorphism</a>.</p></div>\r
71</div>\r
72</div>\r
73<div class="sect1">\r
74<h2 id="_typing_fold01n">Typing Fold01N</h2>\r
75<div class="sectionbody">\r
76<div class="paragraph"><p>Here is the signature for <span class="monospaced">Fold01N</span>. We use a trick to avoid having\r
77to duplicate the definition of some rather complex types in both the\r
78signature and the structure. We first define the types in a\r
79structure. Then, we define them via type re-definitions in the\r
80signature, and via <span class="monospaced">open</span> in the full structure.</p></div>\r
81<div class="listingblock">\r
82<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">Fold01N</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
83<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
84<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;answer</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;zero</span><span class="p">,</span><span class="w"></span>\r
85<span class="w"> </span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">)</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
86<span class="w"> </span><span class="p">((</span><span class="n">&#39;zero</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;zero</span><span class="p">)</span><span class="w"></span>\r
87<span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;accum2</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;answer</span><span class="p">)</span><span class="w"></span>\r
88<span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;zero</span><span class="p">)</span><span class="w"></span>\r
89<span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">),</span><span class="w"></span>\r
90<span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">)</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;c</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</span><span class="p">)</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"></span>\r
91<span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"></span>\r
92<span class="w"> </span><span class="n">&#39;e</span><span class="p">)</span><span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">t</span><span class="w"></span>\r
93\r
94<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;input2</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"></span>\r
95<span class="w"> </span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">)</span><span class="w"> </span><span class="n">step0</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
96<span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;b</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;c</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input1</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">),</span><span class="w"></span>\r
97<span class="w"> </span><span class="n">&#39;b</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;b</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">)</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input2</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">),</span><span class="w"></span>\r
98<span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</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>\r
99\r
100<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;input</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"></span>\r
101<span class="w"> </span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">)</span><span class="w"> </span><span class="n">step1</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
102<span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"></span>\r
103<span class="w"> </span><span class="n">&#39;b</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;c</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;d</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">),</span><span class="w"></span>\r
104<span class="w"> </span><span class="n">&#39;c</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;c</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">)</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">),</span><span class="w"></span>\r
105<span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">)</span><span class="w"> </span><span class="n">Fold</span><span class="p">.</span><span class="n">step1</span><span class="w"></span>\r
106<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
107\r
108<span class="k">signature</span><span class="w"> </span><span class="n">FOLD_01N</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
109<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
110<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;h</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;i</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;j</span><span class="p">)</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
111<span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;h</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;i</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;j</span><span class="p">)</span><span class="w"> </span><span class="n">Fold01N</span><span class="p">.</span><span class="n">t</span><span class="w"></span>\r
112<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;h</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;i</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;j</span><span class="p">)</span><span class="w"> </span><span class="n">step0</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
113<span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;h</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;i</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;j</span><span class="p">)</span><span class="w"> </span><span class="n">Fold01N</span><span class="p">.</span><span class="n">step0</span><span class="w"></span>\r
114<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;h</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;i</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;j</span><span class="p">)</span><span class="w"> </span><span class="n">step1</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
115<span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;h</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;i</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;j</span><span class="p">)</span><span class="w"> </span><span class="n">Fold01N</span><span class="p">.</span><span class="n">step1</span><span class="w"></span>\r
116\r
117<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">fold</span><span class="p">:</span><span class="w"></span>\r
118<span class="w"> </span><span class="p">{</span><span class="n">finish</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;answer</span><span class="p">,</span><span class="w"></span>\r
119<span class="w"> </span><span class="n">start</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;input</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"></span>\r
120<span class="w"> </span><span class="n">zero</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;zero</span><span class="p">}</span><span class="w"></span>\r
121<span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;answer</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;zero</span><span class="p">,</span><span class="w"></span>\r
122<span class="w"> </span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">)</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
123\r
124<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">step0</span><span class="p">:</span><span class="w"></span>\r
125<span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;input2</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"></span>\r
126<span class="w"> </span><span class="n">input</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;input1</span><span class="p">}</span><span class="w"></span>\r
127<span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;input1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;input2</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"></span>\r
128<span class="w"> </span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">)</span><span class="w"> </span><span class="n">step0</span><span class="w"></span>\r
129\r
130<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">step1</span><span class="p">:</span><span class="w"></span>\r
131<span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;accum1</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;input</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">}</span><span class="w"></span>\r
132<span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;accum1</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;input</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;accum2</span><span class="p">,</span><span class="w"></span>\r
133<span class="w"> </span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;c</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;d</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;e</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;f</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;g</span><span class="p">)</span><span class="w"> </span><span class="n">step1</span><span class="w"></span>\r
134<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
135\r
136<span class="k">structure</span><span class="w"> </span><span class="n">Fold01N</span><span class="p">:</span><span class="w"> </span><span class="n">FOLD_01N</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
137<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
138<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">Fold01N</span><span class="w"></span>\r
139\r
140<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">fold</span><span class="w"> </span><span class="p">{</span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">,</span><span class="w"> </span><span class="n">zero</span><span class="p">}</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
141<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">finish</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">zero</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">),</span><span class="w"></span>\r
142<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="p">_,</span><span class="w"> </span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="p">_)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">finish</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="w"> </span><span class="p">()))</span><span class="w"></span>\r
143\r
144<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">step0</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="p">,</span><span class="w"> </span><span class="n">input</span><span class="p">}</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
145<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="w"> </span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="p">_,</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
146<span class="w"> </span><span class="p">(</span><span class="n">finish</span><span class="p">,</span><span class="w"></span>\r
147<span class="w"> </span><span class="n">finish</span><span class="p">,</span><span class="w"></span>\r
148<span class="w"> </span><span class="k">fn</span><span class="w"> </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">input</span><span class="p">,</span><span class="w"></span>\r
149<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">x&#39;</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">combine</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="w"> </span><span class="n">input</span><span class="p">,</span><span class="w"> </span><span class="n">x&#39;</span><span class="p">)))</span><span class="w"></span>\r
150\r
151<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">step1</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="p">}</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
152<span class="w"> </span><span class="n">step0</span><span class="w"> </span><span class="p">{</span><span class="n">combine</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">combine</span><span class="p">,</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">input</span><span class="p">}</span><span class="w"> </span><span class="n">z</span><span class="w"></span>\r
153<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
154</pre></div></div></div>\r
155</div>\r
156</div>\r
157</div>\r
158<div id="footnotes"><hr></div>\r
159<div id="footer">\r
160<div id="footer-text">\r
161</div>\r
162<div id="footer-badges">\r
163</div>\r
164</div>\r
165</body>\r
166</html>\r