Backport from sid to buster
[hcoop/debian/mlton.git] / doc / guide / localhost / SMLNJDeviations
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>SMLNJDeviations</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>SMLNJDeviations</h1>
27 </div>
28 <div id="content">
29 <div id="preamble">
30 <div class="sectionbody">
31 <div class="paragraph"><p>Here are some deviations of <a href="SMLNJ">SML/NJ</a> from
32 <a href="DefinitionOfStandardML">The Definition of Standard ML (Revised)</a>.
33 Some of these are documented in the
34 <a href="http://www.smlnj.org/doc/Conversion/index.html">SML '97 Conversion Guide</a>.
35 Since MLton does not deviate from the Definition, you should look here
36 if you are having trouble porting a program from MLton to SML/NJ or
37 vice versa. If you discover other deviations of SML/NJ that aren&#8217;t
38 listed here, please send mail to
39 <a href="mailto:MLton-devel@mlton.org"><span class="monospaced">MLton-devel@mlton.org</span></a>.</p></div>
40 <div class="ulist"><ul>
41 <li>
42 <p>
43 SML/NJ allows spaces in long identifiers, as in <span class="monospaced">S . x</span>. Section
44 2.5 of the Definition implies that <span class="monospaced">S . x</span> should be treated as three
45 separate lexical items.
46 </p>
47 </li>
48 <li>
49 <p>
50 SML/NJ allows <span class="monospaced">op</span> to appear in <span class="monospaced">val</span> specifications:
51 </p>
52 <div class="listingblock">
53 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">FOO</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">sig</span><span class="w"></span>
54 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">*</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>
55 <span class="k">end</span><span class="w"></span>
56 </pre></div></div></div>
57 <div class="paragraph"><p>The grammar on page 14 of the Definition does not allow it. Recent
58 versions of SML/NJ do give a warning.</p></div>
59 </li>
60 <li>
61 <p>
62 SML/NJ rejects
63 </p>
64 <div class="listingblock">
65 <div class="content"><div class="highlight"><pre><span class="p">(</span><span class="k">op</span><span class="w"> </span><span class="n">*</span><span class="p">)</span><span class="w"></span>
66 </pre></div></div></div>
67 <div class="paragraph"><p>as an unmatched close comment.</p></div>
68 </li>
69 <li>
70 <p>
71 SML/NJ allows <span class="monospaced">=</span> to be rebound by the declaration:
72 </p>
73 <div class="listingblock">
74 <div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>
75 </pre></div></div></div>
76 <div class="paragraph"><p>This is explicitly forbidden on page 5 of the Definition. Recent
77 versions of SML/NJ do give a warning.</p></div>
78 </li>
79 <li>
80 <p>
81 SML/NJ allows rebinding <span class="monospaced">true</span>, <span class="monospaced">false</span>, <span class="monospaced">nil</span>, <span class="monospaced">::</span>, and <span class="monospaced">ref</span> by
82 the declarations:
83 </p>
84 <div class="listingblock">
85 <div class="content"><div class="highlight"><pre><span class="k">fun</span><span class="w"> </span><span class="n">true</span><span class="w"> </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>
86 <span class="k">fun</span><span class="w"> </span><span class="n">false</span><span class="w"> </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>
87 <span class="k">fun</span><span class="w"> </span><span class="n">nil</span><span class="w"> </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>
88 <span class="k">fun</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="n">::</span><span class="w"> </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>
89 <span class="k">fun</span><span class="w"> </span><span class="n">ref</span><span class="w"> </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>
90 </pre></div></div></div>
91 <div class="paragraph"><p>This is explicitly forbidden on page 9 of the Definition.</p></div>
92 </li>
93 <li>
94 <p>
95 SML/NJ extends the syntax of the language to allow vector
96 expressions and patterns like the following:
97 </p>
98 <div class="listingblock">
99 <div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">#[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span><span class="w"></span>
100 <span class="k">val</span><span class="w"> </span><span class="p">#[</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"></span>
101 </pre></div></div></div>
102 <div class="paragraph"><p>MLton supports vector expressions and patterns with the <a href="SuccessorML#VectorExpsAndPats"><span class="monospaced">allowVectorExpsAndPats</span></a> <a href="MLBasisAnnotations">ML Basis annotation</a>.</p></div>
103 </li>
104 <li>
105 <p>
106 SML/NJ extends the syntax of the language to allow <em>or patterns</em>
107 like the following:
108 </p>
109 <div class="listingblock">
110 <div class="content"><div class="highlight"><pre><span class="k">datatype</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Foo</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">Bar</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
111 <span class="k">val</span><span class="w"> </span><span class="p">(</span><span class="n">Foo</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">Bar</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Foo</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>
112 </pre></div></div></div>
113 <div class="paragraph"><p>MLton supports or patterns with the <a href="SuccessorML#OrPats"><span class="monospaced">allowOrPats</span></a> <a href="MLBasisAnnotations">ML Basis annotation</a>.</p></div>
114 </li>
115 <li>
116 <p>
117 SML/NJ allows higher-order functors, that is, functors can be
118 components of structures and can be passed as functor arguments and
119 returned as functor results. As a consequence, SML/NJ allows
120 abbreviated functor definitions, as in the following:
121 </p>
122 <div class="listingblock">
123 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
124 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
125 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
126 <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">t</span><span class="w"></span>
127 <span class="w"> </span><span class="k">end</span><span class="w"></span>
128 <span class="k">functor</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="p">(</span><span class="k">structure</span><span class="w"> </span><span class="n">A</span><span class="p">:</span><span class="w"> </span><span class="n">S</span><span class="p">):</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
129 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
130 <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">A</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">t</span><span class="w"></span>
131 <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="p">(</span><span class="n">A</span><span class="p">.</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="w"></span>
132 <span class="w"> </span><span class="k">end</span><span class="w"></span>
133 <span class="k">functor</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="w"></span>
134 </pre></div></div></div>
135 </li>
136 <li>
137 <p>
138 SML/NJ extends the syntax of the language to allow <span class="monospaced">functor</span> and
139 <span class="monospaced">signature</span> declarations to occur within the scope of <span class="monospaced">local</span> and
140 <span class="monospaced">structure</span> declarations.
141 </p>
142 </li>
143 <li>
144 <p>
145 SML/NJ allows duplicate type specifications in signatures when the
146 duplicates are introduced by <span class="monospaced">include</span>, as in the following:
147 </p>
148 <div class="listingblock">
149 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG1</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
150 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
151 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
152 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"></span>
153 <span class="w"> </span><span class="k">end</span><span class="w"></span>
154 <span class="k">signature</span><span class="w"> </span><span class="n">SIG2</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
155 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
156 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
157 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">v</span><span class="w"></span>
158 <span class="w"> </span><span class="k">end</span><span class="w"></span>
159 <span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
160 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
161 <span class="w"> </span><span class="k">include</span><span class="w"> </span><span class="n">SIG1</span><span class="w"></span>
162 <span class="w"> </span><span class="k">include</span><span class="w"> </span><span class="n">SIG2</span><span class="w"></span>
163 <span class="w"> </span><span class="k">end</span><span class="w"></span>
164 </pre></div></div></div>
165 <div class="paragraph"><p>This is disallowed by rule 77 of the Definition.</p></div>
166 </li>
167 <li>
168 <p>
169 SML/NJ allows sharing constraints between type abbreviations in
170 signatures, as in the following:
171 </p>
172 <div class="listingblock">
173 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
174 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
175 <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><span class="n">*</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
176 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
177 <span class="w"> </span><span class="k">sharing</span><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">u</span><span class="w"></span>
178 <span class="w"> </span><span class="k">end</span><span class="w"></span>
179 </pre></div></div></div>
180 <div class="paragraph"><p>These are disallowed by rule 78 of the Definition. Recent versions of
181 SML/NJ correctly disallow sharing constraints between type
182 abbreviations in signatures.</p></div>
183 </li>
184 <li>
185 <p>
186 SML/NJ disallows multiple <span class="monospaced">where type</span> specifications of the same
187 type name, as in the following
188 </p>
189 <div class="listingblock">
190 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
191 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
192 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
193 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
194 <span class="w"> </span><span class="k">end</span><span class="w"></span>
195 <span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
196 </pre></div></div></div>
197 <div class="paragraph"><p>This is allowed by rule 64 of the Definition.</p></div>
198 </li>
199 <li>
200 <p>
201 SML/NJ allows <span class="monospaced">and</span> in <span class="monospaced">sharing</span> specs in signatures, as in
202 </p>
203 <div class="listingblock">
204 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
205 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
206 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
207 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"></span>
208 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">v</span><span class="w"></span>
209 <span class="w"> </span><span class="k">sharing</span><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">u</span><span class="w"></span>
210 <span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"></span>
211 <span class="w"> </span><span class="k">end</span><span class="w"></span>
212 </pre></div></div></div>
213 </li>
214 <li>
215 <p>
216 SML/NJ does not expand the <span class="monospaced">withtype</span> derived form as described by
217 the Definition. According to page 55 of the Definition, the type
218 bindings of a <span class="monospaced">withtype</span> declaration are substituted simultaneously in
219 the connected datatype. Consider the following program.
220 </p>
221 <div class="listingblock">
222 <div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">real</span><span class="w"> </span><span class="p">;</span><span class="w"></span>
223 <span class="k">datatype</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
224 <span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
225 <span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">u</span><span class="w"></span>
226 <span class="k">withtype</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
227 <span class="k">and</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">u</span><span class="w"></span>
228 </pre></div></div></div>
229 <div class="paragraph"><p>According to the Definition, it should be expanded to the following.</p></div>
230 <div class="listingblock">
231 <div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">real</span><span class="w"> </span><span class="p">;</span><span class="w"></span>
232 <span class="k">datatype</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
233 <span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">u</span><span class="w"></span>
234 <span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">;</span><span class="w"></span>
235 <span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
236 <span class="k">and</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">u</span><span class="w"></span>
237 </pre></div></div></div>
238 <div class="paragraph"><p>However, SML/NJ expands <span class="monospaced">withtype</span> bindings sequentially, meaning that
239 earlier bindings are expanded within later ones. Hence, the above
240 program is expanded to the following.</p></div>
241 <div class="listingblock">
242 <div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">real</span><span class="w"> </span><span class="p">;</span><span class="w"></span>
243 <span class="k">datatype</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
244 <span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
245 <span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">;</span><span class="w"></span>
246 <span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
247 <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>
248 </pre></div></div></div>
249 </li>
250 <li>
251 <p>
252 SML/NJ allows <span class="monospaced">withtype</span> specifications in signatures.
253 </p>
254 <div class="paragraph"><p>MLton supports <span class="monospaced">withtype</span> specifications in signatures with the <a href="SuccessorML#SigWithtype"><span class="monospaced">allowSigWithtype</span></a> <a href="MLBasisAnnotations">ML Basis annotation</a>.</p></div>
255 </li>
256 <li>
257 <p>
258 SML/NJ allows a <span class="monospaced">where</span> structure specification that is similar to a
259 <span class="monospaced">where type</span> specification. For example:
260 </p>
261 <div class="listingblock">
262 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">struct</span><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><span class="k">end</span><span class="w"></span>
263 <span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
264 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
265 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
266 <span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">where</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">S</span><span class="w"></span>
267 </pre></div></div></div>
268 <div class="paragraph"><p>This is equivalent to:</p></div>
269 <div class="listingblock">
270 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">struct</span><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><span class="k">end</span><span class="w"></span>
271 <span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
272 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
273 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
274 <span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">T</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">S</span><span class="p">.</span><span class="n">t</span><span class="w"></span>
275 </pre></div></div></div>
276 <div class="paragraph"><p>SML/NJ also allows a definitional structure specification that is
277 similar to a definitional type specification. For example:</p></div>
278 <div class="listingblock">
279 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">struct</span><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><span class="k">end</span><span class="w"></span>
280 <span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
281 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
282 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">S</span><span class="w"></span>
283 <span class="w"> </span><span class="k">end</span><span class="w"></span>
284 </pre></div></div></div>
285 <div class="paragraph"><p>This is equivalent to the previous examples and to:</p></div>
286 <div class="listingblock">
287 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">struct</span><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><span class="k">end</span><span class="w"></span>
288 <span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
289 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
290 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">where</span><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">S</span><span class="p">.</span><span class="n">t</span><span class="w"></span>
291 <span class="w"> </span><span class="k">end</span><span class="w"></span>
292 </pre></div></div></div>
293 </li>
294 <li>
295 <p>
296 SML/NJ disallows binding non-datatypes with datatype replication.
297 For example, it rejects the following program that should be allowed
298 according to the Definition.
299 </p>
300 <div class="listingblock">
301 <div class="content"><div class="highlight"><pre><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">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </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>
302 <span class="k">datatype</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">datatype</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
303 </pre></div></div></div>
304 <div class="paragraph"><p>This idiom can be useful when one wants to rename a type without
305 rewriting all the type arguments. For example, the above would have
306 to be written in SML/NJ as follows.</p></div>
307 <div class="listingblock">
308 <div class="content"><div class="highlight"><pre><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">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </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>
309 <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">u</span><span class="w"> </span><span class="p">=</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">t</span><span class="w"></span>
310 </pre></div></div></div>
311 </li>
312 <li>
313 <p>
314 SML/NJ disallows sharing a structure with one of its substructures.
315 For example, SML/NJ disallows the following.
316 </p>
317 <div class="listingblock">
318 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
319 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
320 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="p">:</span><span class="w"></span>
321 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
322 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
323 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
324 <span class="w"> </span><span class="k">end</span><span class="w"></span>
325 <span class="w"> </span><span class="k">sharing</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">S</span><span class="p">.</span><span class="n">T</span><span class="w"></span>
326 <span class="w"> </span><span class="k">end</span><span class="w"></span>
327 </pre></div></div></div>
328 <div class="paragraph"><p>This signature is allowed by the Definition.</p></div>
329 </li>
330 <li>
331 <p>
332 SML/NJ disallows polymorphic generalization of refutable
333 patterns. For example, SML/NJ disallows the following.
334 </p>
335 <div class="listingblock">
336 <div class="content"><div class="highlight"><pre><span class="k">val</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>
337 <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="p">(</span><span class="mi">1</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;one&quot;</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"></span>
338 </pre></div></div></div>
339 <div class="paragraph"><p>Recent versions of SML/NJ correctly allow polymorphic generalization
340 of refutable patterns.</p></div>
341 </li>
342 <li>
343 <p>
344 SML/NJ uses an overly restrictive context for type inference. For
345 example, SML/NJ rejects both of the following.
346 </p>
347 <div class="listingblock">
348 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
349 <span class="k">struct</span><span class="w"></span>
350 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">z</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="w"></span>
351 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="p">[</span><span class="n">true</span><span class="p">]</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">nil</span><span class="w"></span>
352 <span class="k">end</span><span class="w"></span>
353 </pre></div></div></div>
354 <div class="listingblock">
355 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
356 <span class="k">struct</span><span class="w"></span>
357 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">z</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="w"></span>
358 <span class="k">end</span><span class="w"></span>
359 </pre></div></div></div>
360 <div class="paragraph"><p>These structures are allowed by the Definition.</p></div>
361 </li>
362 </ul></div>
363 </div>
364 </div>
365 <div class="sect1">
366 <h2 id="_deviations_from_the_basis_library_specification">Deviations from the Basis Library Specification</h2>
367 <div class="sectionbody">
368 <div class="paragraph"><p>Here are some deviations of SML/NJ from the <a href="BasisLibrary">Basis Library</a>
369 <a href="http://www.standardml.org/Basis">specification</a>.</p></div>
370 <div class="ulist"><ul>
371 <li>
372 <p>
373 SML/NJ exposes the equality of the <span class="monospaced">vector</span> type in structures such
374 as <span class="monospaced">Word8Vector</span> that abstractly match <span class="monospaced">MONO_VECTOR</span>, which says
375 <span class="monospaced">type vector</span>, not <span class="monospaced">eqtype vector</span>. So, for example, SML/NJ accepts
376 the following program:
377 </p>
378 <div class="listingblock">
379 <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">v</span><span class="p">:</span><span class="w"> </span><span class="n">Word8Vector</span><span class="p">.</span><span class="n">vector</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"></span>
380 </pre></div></div></div>
381 </li>
382 <li>
383 <p>
384 SML/NJ exposes the equality property of the type <span class="monospaced">status</span> in
385 <span class="monospaced">OS.Process</span>. This means that programs which directly compare two
386 values of type <span class="monospaced">status</span> will work with SML/NJ but not MLton.
387 </p>
388 </li>
389 <li>
390 <p>
391 Under SML/NJ on Windows, <span class="monospaced">OS.Path.validVolume</span> incorrectly considers
392 absolute empty volumes to be valid. In other words, when the
393 expression
394 </p>
395 <div class="listingblock">
396 <div class="content"><div class="highlight"><pre><span class="n">OS</span><span class="p">.</span><span class="n">Path</span><span class="p">.</span><span class="n">validVolume</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">isAbs</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">true</span><span class="p">,</span><span class="w"> </span><span class="n">vol</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
397 </pre></div></div></div>
398 <div class="paragraph"><p>is evaluated by SML/NJ on Windows, the result is <span class="monospaced">true</span>. MLton, on
399 the other hand, correctly follows the Basis Library Specification,
400 which states that on Windows, <span class="monospaced">OS.Path.validVolume</span> should return
401 <span class="monospaced">false</span> whenever <span class="monospaced">isAbs = true</span> and <span class="monospaced">vol = ""</span>.</p></div>
402 <div class="paragraph"><p>This incorrect behavior causes other <span class="monospaced">OS.Path</span> functions to behave
403 differently. For example, when the expression</p></div>
404 <div class="listingblock">
405 <div class="content"><div class="highlight"><pre><span class="n">OS</span><span class="p">.</span><span class="n">Path</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="p">(</span><span class="n">OS</span><span class="p">.</span><span class="n">Path</span><span class="p">.</span><span class="n">fromString</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\\</span><span class="s">usr</span><span class="se">\\</span><span class="s">local&quot;</span><span class="p">)</span><span class="w"></span>
406 </pre></div></div></div>
407 <div class="paragraph"><p>is evaluated by SML/NJ on Windows, the result is <span class="monospaced">"\\usr\\local"</span>,
408 whereas under MLton on Windows, evaluating this expression (correctly)
409 causes an <span class="monospaced">OS.Path.Path</span> exception to be raised.</p></div>
410 </li>
411 </ul></div>
412 </div>
413 </div>
414 </div>
415 <div id="footnotes"><hr></div>
416 <div id="footer">
417 <div id="footer-text">
418 </div>
419 <div id="footer-badges">
420 </div>
421 </div>
422 </body>
423 </html>