File: GenerativeException

package info (click to toggle)
mlton 20061107-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 27,828 kB
  • ctags: 61,118
  • sloc: ansic: 11,446; makefile: 1,339; sh: 1,160; lisp: 900; pascal: 256; asm: 97
file content (133 lines) | stat: -rw-r--r-- 8,794 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<!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>GenerativeException - 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 20061025</a>
    <td style = "
		border: 0px;
		font-size: 150%;
		text-align: center;
		width: 50%;">
      GenerativeException
    <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">
In <a href="StandardML">Standard ML</a>, exception declarations are said to be <em>generative</em>, because each time an exception declaration is evaluated, it yields a new exception. <p>
The following program demonstrates the generativity of exceptions. 
<pre class=code>
<B><FONT COLOR="#A020F0">exception</FONT></B> E
<B><FONT COLOR="#A020F0">val</FONT></B> e1 <B><FONT COLOR="#5F9EA0">=</FONT></B> E
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">isE1</FONT></I></B></FONT></B> (e: exn): <B><FONT COLOR="#228B22">bool</FONT></B> <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">case</FONT></B> e <B><FONT COLOR="#A020F0">of</FONT></B>
      E <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> true
    <B><FONT COLOR="#5F9EA0">|</FONT></B> _ <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> false
<B><FONT COLOR="#A020F0">exception</FONT></B> E
<B><FONT COLOR="#A020F0">val</FONT></B> e2 <B><FONT COLOR="#5F9EA0">=</FONT></B> E
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">isE2</FONT></I></B></FONT></B> (e: exn): <B><FONT COLOR="#228B22">bool</FONT></B> <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">case</FONT></B> e <B><FONT COLOR="#A020F0">of</FONT></B>
      E <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> true
    <B><FONT COLOR="#5F9EA0">|</FONT></B> _ <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> false
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">pb</FONT></I></B></FONT></B> (b: <B><FONT COLOR="#228B22">bool</FONT></B>): <B><FONT COLOR="#228B22">unit</FONT></B> <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">print</FONT></B> (<B><FONT COLOR="#A020F0">concat</FONT></B> [Bool.toString b, <B><FONT COLOR="#BC8F8F">&quot;\n&quot;</FONT></B>])
<B><FONT COLOR="#A020F0">val</FONT></B> () <B><FONT COLOR="#5F9EA0">=</FONT></B> (pb (isE1 e1)
          ;pb (isE1 e2)
          ; pb (isE2 e1)
          ; pb (isE2 e2))
</PRE>
 In the above program, two different exception declarations declare an exception <tt>E</tt> and a corresponding function that returns <tt>true</tt> only on that exception.  Although declared by syntactically identical exception declarations, <tt>e1</tt> and <tt>e2</tt> are different exceptions.  The program, when run, prints <tt>true</tt>, <tt>false</tt>, <tt>false</tt>, <tt>true</tt>. 
</p>
<p>
A slight modification of the above program shows that even a single exception declaration yields a new exception each time it is evaluated. 
<pre class=code>
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">f</FONT></I></B></FONT></B> (): exn <B><FONT COLOR="#5F9EA0">*</FONT></B> (exn <B><FONT COLOR="#5F9EA0">-</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> <B><FONT COLOR="#228B22">bool</FONT></B>) <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">let</FONT></B>
      <B><FONT COLOR="#A020F0">exception</FONT></B> E
   <B><FONT COLOR="#A020F0">in</FONT></B>
      (E, <B><FONT COLOR="#A020F0">fn</FONT></B> E <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> true <B><FONT COLOR="#5F9EA0">|</FONT></B> _ <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> false)
   <B><FONT COLOR="#A020F0">end</FONT></B>
<B><FONT COLOR="#A020F0">val</FONT></B> (e1, isE1) <B><FONT COLOR="#5F9EA0">=</FONT></B> f ()
<B><FONT COLOR="#A020F0">val</FONT></B> (e2, isE2) <B><FONT COLOR="#5F9EA0">=</FONT></B> f ()
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">pb</FONT></I></B></FONT></B> (b: <B><FONT COLOR="#228B22">bool</FONT></B>): <B><FONT COLOR="#228B22">unit</FONT></B> <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">print</FONT></B> (<B><FONT COLOR="#A020F0">concat</FONT></B> [Bool.toString b, <B><FONT COLOR="#BC8F8F">&quot;\n&quot;</FONT></B>])
<B><FONT COLOR="#A020F0">val</FONT></B> () <B><FONT COLOR="#5F9EA0">=</FONT></B> (pb (isE1 e1)
          ; pb (isE1 e2)
          ; pb (isE2 e1)
          ; pb (isE2 e2))
</PRE>
 Each call to <tt>f</tt> yields a new exception and a function that returns <tt>true</tt> only on that exception.  The program, when run, prints <tt>true</tt>, <tt>false</tt>, <tt>false</tt>, <tt>true</tt>. 
</p>
<h2 id="head-86469abfaa44f69bd741f559ff1bb935309ad35e">Type Safety</h2>
<p>
Exception generativity is required for type safety.  Consider the following valid SML program. 
<pre class=code>
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">f</FONT></I></B></FONT></B> (): ('a <B><FONT COLOR="#5F9EA0">-</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> exn) <B><FONT COLOR="#5F9EA0">*</FONT></B> (exn <B><FONT COLOR="#5F9EA0">-</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> 'a) <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">let</FONT></B>
      <B><FONT COLOR="#A020F0">exception</FONT></B> E <B><FONT COLOR="#A020F0">of</FONT></B> 'a
   <B><FONT COLOR="#A020F0">in</FONT></B>
      (E, <B><FONT COLOR="#A020F0">fn</FONT></B> E x <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> x <B><FONT COLOR="#5F9EA0">|</FONT></B> _ <B><FONT COLOR="#5F9EA0">=</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> <B><FONT COLOR="#A020F0">raise</FONT></B> Fail <B><FONT COLOR="#BC8F8F">&quot;f&quot;</FONT></B>)
   <B><FONT COLOR="#A020F0">end</FONT></B>
<B><FONT COLOR="#A020F0">fun </FONT></B><B><FONT COLOR="#0000FF"><B><I><FONT COLOR="#000000">cast</FONT></I></B></FONT></B> (a: 'a): 'b <B><FONT COLOR="#5F9EA0">=</FONT></B>
   <B><FONT COLOR="#A020F0">let</FONT></B>
      <B><FONT COLOR="#A020F0">val</FONT></B> (make: 'a <B><FONT COLOR="#5F9EA0">-</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> exn, _) <B><FONT COLOR="#5F9EA0">=</FONT></B> f ()
      <B><FONT COLOR="#A020F0">val</FONT></B> (_, get: exn <B><FONT COLOR="#5F9EA0">-</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> 'b) <B><FONT COLOR="#5F9EA0">=</FONT></B> f ()
   <B><FONT COLOR="#A020F0">in</FONT></B>
      get (make a)
   <B><FONT COLOR="#A020F0">end</FONT></B>
<B><FONT COLOR="#A020F0">val</FONT></B> _ <B><FONT COLOR="#5F9EA0">=</FONT></B> ((cast 13): <B><FONT COLOR="#228B22">int</FONT></B> <B><FONT COLOR="#5F9EA0">-</FONT></B><B><FONT COLOR="#5F9EA0">&gt;</FONT></B> <B><FONT COLOR="#228B22">int</FONT></B>) 14
</PRE>
 
</p>
<p>
If exceptions weren't generative, then each call <tt>f&nbsp;()</tt> would yield the same exception constructor <tt>E</tt>.  Then, our <tt>cast</tt> function could use <tt>make:&nbsp;'a&nbsp;-&gt;&nbsp;exn</tt> to convert any value into an exception and then <tt>get:&nbsp;exn&nbsp;-&gt;&nbsp;'b</tt> to convert that exception to a value of arbitrary type.  If <tt>cast</tt> worked, then we could cast an integer as a function and apply.  Of course, because of generative exceptions, this program raises <tt>Fail&nbsp;"f"</tt>. 
</p>
</div>



<p>
<hr>
Last edited on 2005-01-26 20:34:34 by <span title="cfs36.cs.cornell.edu"><a href="MatthewFluet">MatthewFluet</a></span>.
</body></html>