<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta name="robots" content="index,nofollow">



<title>EqualityTypeVariable - MLton Standard ML Compiler (SML Compiler)</title>
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="all" href="common.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="screen" href="screen.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="print" href="print.css">


<link rel="Start" href="Home">


</head>

<body lang="en" dir="ltr">

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-833377-1";
urchinTracker();
</script>
<table bgcolor = lightblue cellspacing = 0 style = "border: 0px;" width = 100%>
  <tr>
    <td style = "
		border: 0px;
		color: darkblue; 
		font-size: 150%;
		text-align: left;">
      <a class = mltona href="Home">MLton MLTONWIKIVERSION</a>
    <td style = "
		border: 0px;
		font-size: 150%;
		text-align: center;
		width: 50%;">
      EqualityTypeVariable
    <td style = "
		border: 0px;
		text-align: right;">
      <table cellspacing = 0 style = "border: 0px">
        <tr style = "vertical-align: middle;">
      </table>
  <tr style = "background-color: white;">
    <td colspan = 3
	style = "
		border: 0px;
		font-size:70%;
		text-align: right;">
      <a href = "Home">Home</a>
      &nbsp;<a href = "Index">Index</a>
      &nbsp;
</table>
<div id="content" lang="en" dir="ltr">
An equality type variable is a type variable that starts with two or more primes, as in <tt>''a</tt> or <tt>''b</tt>.  The canonical use of equality type variables is in specifying the type of the <a href="PolymorphicEquality">PolymorphicEquality</a> function, which is <tt>''a&nbsp;*&nbsp;''a&nbsp;-&gt;&nbsp;bool</tt>. Equality type variables ensure that polymorphic equality is only used on <a href="EqualityType">equality types</a>, by requiring that at every use of a polymorphic value, equality type variables are instantiated by equality types. <p>
For example, the following program is type correct because polymorphic equality is applied to variables of type <tt>''a</tt>. 
</p>

<pre class=code>
<B><FONT COLOR="#A020F0">fun</FONT></B> f (x: ''a, y: ''a): bool = x = y
</PRE>
<p>
 
</p>
<p>
On the other hand, the following program is not type correct, because polymorphic equality is applied to variables of type <tt>'a</tt>, which is not an equality type. 
</p>

<pre class=code>
<B><FONT COLOR="#A020F0">fun</FONT></B> f (x: 'a, y: 'a): bool = x = y
</PRE>
<p>
 
</p>
<p>
MLton reports the following error, indicating that polymorphic equality expects equality types, but didn't get them. 
</p>

<pre>Error: z.sml 1.32.
  Function applied to incorrect argument.
    expects: [&lt;equality&gt;] * [&lt;equality&gt;]
    but got: [&lt;non-equality&gt;] * [&lt;non-equality&gt;]
    in: = (x, y)
</pre><p>
As an example of using such a function that requires equality types, suppose that <tt>f</tt> has polymorphic type <tt>''a&nbsp;-&gt;&nbsp;unit</tt>.  Then, <tt>f&nbsp;13</tt> is type correct because <tt>int</tt> is an equality type.  On the other hand, <tt>f&nbsp;13.0</tt> and <tt>f&nbsp;(fn&nbsp;x&nbsp;=&gt;&nbsp;x)</tt> are not type correct, because <tt>real</tt> and arrow types are not equality types. We can test these facts with the following short programs.  First, we verify that such an <tt>f</tt> can be applied to integers. 
</p>

<pre class=code>
<B><FONT COLOR="#0000FF">functor</FONT></B> Ok (<B><FONT COLOR="#A020F0">val</FONT></B> f: ''a -&gt; unit): <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#0000FF">end</FONT></B> =
   <B><FONT COLOR="#0000FF">struct</FONT></B>
      <B><FONT COLOR="#A020F0">val</FONT></B> () = f <B><FONT COLOR="#5F9EA0">13</FONT></B>
      <B><FONT COLOR="#A020F0">val</FONT></B> () = f <B><FONT COLOR="#5F9EA0">14</FONT></B>
   <B><FONT COLOR="#0000FF">end</FONT></B>
</PRE>
<p>
 
</p>
<p>
We can do better, and verify that such an <tt>f</tt> can be applied to any integer. 
</p>

<pre class=code>
<B><FONT COLOR="#0000FF">functor</FONT></B> Ok (<B><FONT COLOR="#A020F0">val</FONT></B> f: ''a -&gt; unit): <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#0000FF">end</FONT></B> =
   <B><FONT COLOR="#0000FF">struct</FONT></B>
      <B><FONT COLOR="#A020F0">fun</FONT></B> g (x: int) = f x
   <B><FONT COLOR="#0000FF">end</FONT></B>
</PRE>
<p>
 
</p>
<p>
Even better, we don't need to introduce a dummy function name; we can use a type constraint. 
</p>

<pre class=code>
<B><FONT COLOR="#0000FF">functor</FONT></B> Ok (<B><FONT COLOR="#A020F0">val</FONT></B> f: ''a -&gt; unit): <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#0000FF">end</FONT></B> =
   <B><FONT COLOR="#0000FF">struct</FONT></B>
      <B><FONT COLOR="#A020F0">val</FONT></B> _ = f: int -&gt; unit
   <B><FONT COLOR="#0000FF">end</FONT></B>
</PRE>
<p>
 
</p>
<p>
Even better, we can use a signature constraint. 
</p>

<pre class=code>
<B><FONT COLOR="#0000FF">functor</FONT></B> Ok (S: <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#A020F0">val</FONT></B> f: ''a -&gt; unit <B><FONT COLOR="#0000FF">end</FONT></B>):
   <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#A020F0">val</FONT></B> f: int -&gt; unit <B><FONT COLOR="#0000FF">end</FONT></B> = S
</PRE>
<p>
 
</p>
<p>
This functor concisely verifies that a function of polymorphic type <tt>''a&nbsp;-&gt;&nbsp;unit</tt> can be safely used as a function of type <tt>int&nbsp;-&gt;&nbsp;unit</tt>. 
</p>
<p>
As above, we can verify that such an <tt>f</tt> can not be used at non equality types. 
</p>

<pre class=code>
<B><FONT COLOR="#0000FF">functor</FONT></B> Bad (S: <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#A020F0">val</FONT></B> f: ''a -&gt; unit <B><FONT COLOR="#0000FF">end</FONT></B>):
   <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#A020F0">val</FONT></B> f: real -&gt; unit <B><FONT COLOR="#0000FF">end</FONT></B> = S
</PRE>
<p>
 
</p>

<pre class=code>
<B><FONT COLOR="#0000FF">functor</FONT></B> Bad (S: <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#A020F0">val</FONT></B> f: ''a -&gt; unit <B><FONT COLOR="#0000FF">end</FONT></B>):
   <B><FONT COLOR="#0000FF">sig</FONT></B> <B><FONT COLOR="#A020F0">val</FONT></B> f: ('a -&gt; 'a) -&gt; unit <B><FONT COLOR="#0000FF">end</FONT></B> = S
</PRE>
<p>
 
</p>
<p>
For each of these programs, MLton reports the following error. 
</p>

<pre>Error: z.sml 2.4.
  Variable type in structure disagrees with signature.
    variable: f
    structure: [&lt;equality&gt;] -&gt; _
    signature: [&lt;non-equality&gt;] -&gt; _
</pre><h2 id="head-298e9694028673faa9fcbabf774bc23e4d2fbbe0">Equality type variables in type and datatype declarations</h2>
<p>
Equality type variables can be used in type and datatype declarations; however they play no special role.  For example, 
</p>

<pre class=code>
<B><FONT COLOR="#A020F0">type</FONT></B><B><FONT COLOR="#228B22"> 'a t </FONT></B>=<B><FONT COLOR="#228B22"> 'a * int
</FONT></B></PRE>
<p>
 
</p>
<p>
is completely identical to 
</p>

<pre class=code>
<B><FONT COLOR="#A020F0">type</FONT></B><B><FONT COLOR="#228B22"> ''a t </FONT></B>=<B><FONT COLOR="#228B22"> ''a * int
</FONT></B></PRE>
<p>
 
</p>
<p>
In particular, such a definition does <em>not</em> require that <tt>t</tt> only be applied to equality types. 
</p>
<p>
Similarly,  
</p>

<pre class=code>
<B><FONT COLOR="#A020F0">datatype</FONT></B><B><FONT COLOR="#228B22"> 'a t </FONT></B>=<B><FONT COLOR="#228B22"> <FONT COLOR="#B8860B">A</FONT> </FONT></B>|<B><FONT COLOR="#228B22"> <FONT COLOR="#B8860B">B</FONT> <B><FONT COLOR="#A020F0">of</FONT></B> 'a
</FONT></B></PRE>
<p>
 
</p>
<p>
is completely identical to 
</p>

<pre class=code>
<B><FONT COLOR="#A020F0">datatype</FONT></B><B><FONT COLOR="#228B22"> ''a t </FONT></B>=<B><FONT COLOR="#228B22"> <FONT COLOR="#B8860B">A</FONT> </FONT></B>|<B><FONT COLOR="#228B22"> <FONT COLOR="#B8860B">B</FONT> <B><FONT COLOR="#A020F0">of</FONT></B> ''a
</FONT></B></PRE>
<p>
 
</p>
</div>



<p>
<hr>
Last edited on 2005-12-01 04:00:38 by <span title="ppp-71-139-183-221.dsl.snfc21.pacbell.net"><a href="StephenWeeks">StephenWeeks</a></span>.
</body></html>
