Import Debian changes 20180207-1
[hcoop/debian/mlton.git] / doc / guide / localhost / TypeChecking
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <meta name="generator" content="AsciiDoc 8.6.9">
6 <title>TypeChecking</title>
7 <link rel="stylesheet" href="./asciidoc.css" type="text/css">
8 <link rel="stylesheet" href="./pygments.css" type="text/css">
9
10
11 <script type="text/javascript" src="./asciidoc.js"></script>
12 <script type="text/javascript">
13 /*<![CDATA[*/
14 asciidoc.install();
15 /*]]>*/
16 </script>
17 <link rel="stylesheet" href="./mlton.css" type="text/css">
18 </head>
19 <body class="article">
20 <div id="banner">
21 <div id="banner-home">
22 <a href="./Home">MLton 20180207</a>
23 </div>
24 </div>
25 <div id="header">
26 <h1>TypeChecking</h1>
27 </div>
28 <div id="content">
29 <div id="preamble">
30 <div class="sectionbody">
31 <div class="paragraph"><p>MLton&#8217;s type checker follows the <a href="DefinitionOfStandardML">Definition</a>
32 closely, so you may find differences between MLton and other SML
33 compilers that do not follow the Definition so closely. In
34 particular, SML/NJ has many deviations from the Definition&#8201;&#8212;&#8201;please
35 see <a href="SMLNJDeviations">SMLNJDeviations</a> for those that we are aware of.</p></div>
36 <div class="paragraph"><p>In some respects MLton&#8217;s type checker is more powerful than other SML
37 compilers, so there are programs that MLton accepts that are rejected
38 by some other SML compilers. These kinds of programs fall into a few
39 simple categories.</p></div>
40 <div class="ulist"><ul>
41 <li>
42 <p>
43 MLton resolves flexible record patterns using a larger context than
44 many other SML compilers. For example, MLton accepts the
45 following.
46 </p>
47 <div class="listingblock">
48 <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">x</span><span class="p">,</span><span class="w"> </span><span class="p">...}</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>
49 <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">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&quot;foo&quot;</span><span class="p">}</span><span class="w"></span>
50 </pre></div></div></div>
51 </li>
52 <li>
53 <p>
54 MLton uses as large a context as possible to resolve the type of
55 variables constrained by the value restriction to be monotypes. For
56 example, MLton accepts the following.
57 </p>
58 <div class="listingblock">
59 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="p">:</span><span class="w"></span>
60 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
61 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">f</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
62 <span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
63 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
64 <span class="w"> </span><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="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">x</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">y</span><span class="p">)</span><span class="w"></span>
65 <span class="w"> </span><span class="k">end</span><span class="w"></span>
66 </pre></div></div></div>
67 </li>
68 </ul></div>
69 </div>
70 </div>
71 <div class="sect1">
72 <h2 id="_type_error_messages">Type error messages</h2>
73 <div class="sectionbody">
74 <div class="paragraph"><p>To aid in the understanding of type errors, MLton&#8217;s type checker
75 displays type errors differently than other SML compilers. In
76 particular, when two types are different, it is important for the
77 programmer to easily understand why they are different. So, MLton
78 displays only the differences between two types that don&#8217;t match,
79 using underscores for the parts that match. For example, if a
80 function expects <span class="monospaced">real * int</span> but gets <span class="monospaced">real * real</span>, the type error
81 message would look like</p></div>
82 <div class="listingblock">
83 <div class="content monospaced">
84 <pre>expects: _ * [int]
85 but got: _ * [real]</pre>
86 </div></div>
87 <div class="paragraph"><p>As another aid to spotting differences, MLton places brackets <span class="monospaced">[]</span>
88 around the parts of the types that don&#8217;t match. A common situation is
89 when a function receives a different number of arguments than it
90 expects, in which case you might see an error like</p></div>
91 <div class="listingblock">
92 <div class="content monospaced">
93 <pre>expects: [int * real]
94 but got: [int * real * string]</pre>
95 </div></div>
96 <div class="paragraph"><p>The brackets make it easy to see that the problem is that the tuples
97 have different numbers of components&#8201;&#8212;&#8201;not that the components don&#8217;t
98 match. Contrast that with a case where a function receives the right
99 number of arguments, but in the wrong order, in which case you might
100 see an error like</p></div>
101 <div class="listingblock">
102 <div class="content monospaced">
103 <pre>expects: [int] * [real]
104 but got: [real] * [int]</pre>
105 </div></div>
106 <div class="paragraph"><p>Here the brackets make it easy to see that the components do not match.</p></div>
107 <div class="paragraph"><p>We appreciate feedback on any type error messages that you find
108 confusing, or suggestions you may have for improvements to error
109 messages.</p></div>
110 </div>
111 </div>
112 <div class="sect1">
113 <h2 id="_the_shortest_most_recent_rule_for_type_names">The shortest/most-recent rule for type names</h2>
114 <div class="sectionbody">
115 <div class="paragraph"><p>In a type error message, MLton often has a number of choices in
116 deciding what name to use for a type. For example, in the following
117 type-incorrect program</p></div>
118 <div class="listingblock">
119 <div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
120 <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">x</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>
121 <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="s">&quot;foo&quot;</span><span class="w"></span>
122 </pre></div></div></div>
123 <div class="paragraph"><p>MLton reports the error message</p></div>
124 <div class="listingblock">
125 <div class="content monospaced">
126 <pre>Error: z.sml 3.9-3.15.
127 Function applied to incorrect argument.
128 expects: [t]
129 but got: [string]
130 in: f "foo"</pre>
131 </div></div>
132 <div class="paragraph"><p>MLton could have reported <span class="monospaced">expects: [int]</span> instead of <span class="monospaced">expects: [t]</span>.
133 However, MLton uses the shortest/most-recent rule in order to decide
134 what type name to display. This rule means that, at the point of the
135 error, MLton first looks for the shortest name for a type in terms of
136 number of structure identifiers (e.g. <span class="monospaced">foobar</span> is shorter than <span class="monospaced">A.t</span>).
137 Next, if there are multiple names of the same length, then MLton uses
138 the most recently defined name. It is this tiebreaker that causes
139 MLton to prefer <span class="monospaced">t</span> to <span class="monospaced">int</span> in the above example.</p></div>
140 <div class="paragraph"><p>In signature matching, most recently defined is not taken to include
141 all of the definitions introduced by the structure (since the matching
142 takes place outside the structure and before it is defined). For
143 example, in the following type-incorrect program</p></div>
144 <div class="listingblock">
145 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="p">:</span><span class="w"></span>
146 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
147 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
148 <span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
149 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
150 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
151 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&quot;foo&quot;</span><span class="w"></span>
152 <span class="w"> </span><span class="k">end</span><span class="w"></span>
153 </pre></div></div></div>
154 <div class="paragraph"><p>MLton reports the error message</p></div>
155 <div class="listingblock">
156 <div class="content monospaced">
157 <pre>Error: z.sml 2.4-4.6.
158 Variable in structure disagrees with signature (type): x.
159 structure: val x: [string]
160 defn at: z.sml 7.11-7.11
161 signature: val x: [int]
162 spec at: z.sml 3.11-3.11</pre>
163 </div></div>
164 <div class="paragraph"><p>If there is a type that only exists inside the structure being
165 matched, then the prefix <span class="monospaced">_str.</span> is used. For example, in the
166 following type-incorrect program</p></div>
167 <div class="listingblock">
168 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="p">:</span><span class="w"></span>
169 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
170 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
171 <span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
172 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
173 <span class="w"> </span><span class="k">datatype</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">T</span><span class="w"></span>
174 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">T</span><span class="w"></span>
175 <span class="w"> </span><span class="k">end</span><span class="w"></span>
176 </pre></div></div></div>
177 <div class="paragraph"><p>MLton reports the error message</p></div>
178 <div class="listingblock">
179 <div class="content monospaced">
180 <pre>Error: z.sml 2.4-4.6.
181 Variable in structure disagrees with signature (type): x.
182 structure: val x: [_str.t]
183 defn at: z.sml 7.11-7.11
184 signature: val x: [int]
185 spec at: z.sml 3.11-3.11</pre>
186 </div></div>
187 <div class="paragraph"><p>in which the <span class="monospaced">[_str.t]</span> refers to the type defined in the structure.</p></div>
188 </div>
189 </div>
190 </div>
191 <div id="footnotes"><hr></div>
192 <div id="footer">
193 <div id="footer-text">
194 </div>
195 <div id="footer-badges">
196 </div>
197 </div>
198 </body>
199 </html>