Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | (* flexrecord.sml *) |
2 | ||
3 | (* Checks type inference for flexible records. *) | |
4 | ||
5 | (* flexrecord1 *) | |
6 | fun f(r as {...}) = | |
7 | let | |
8 | fun g() = r | |
9 | in | |
10 | [r, {a=1}] | |
11 | end; | |
12 | (* flexrecord1 *) | |
13 | ||
14 | (* flexrecord2 *) | |
15 | val _ = | |
16 | let | |
17 | val g = #foo | |
18 | val _ = g {foo = 13} | |
19 | val _ = g {foo = "yes"} | |
20 | in | |
21 | () | |
22 | end | |
23 | (* flexrecord2 *) | |
24 | ||
25 | (* flexrecord3 *) | |
26 | val _ = | |
27 | let | |
28 | val g = #foo | |
29 | val _ = g {foo = 13, goo = 1.0} | |
30 | val _ = g {foo = "yes", goo = 1.0} | |
31 | in | |
32 | () | |
33 | end | |
34 | (* flexrecord3 *) | |
35 | ||
36 | (* flexrecord4 *) | |
37 | val _ = | |
38 | let | |
39 | val g = #foo | |
40 | val _ = g {foo = 13, goo = 1.0} | |
41 | val _ = g {foo = "yes", goo = false} | |
42 | in | |
43 | () | |
44 | end | |
45 | (* flexrecord4 *) | |
46 | ||
47 | (* flexrecord5 *) | |
48 | val _ = | |
49 | let | |
50 | val f = #foo | |
51 | val g = fn h => fn y => h (f y) | |
52 | val h = fn x => f x | |
53 | val _ = f {foo=0, bar=1} | |
54 | in | |
55 | () | |
56 | end | |
57 | (* flexrecord5 *) | |
58 | ||
59 | (* flexrecord6 *) | |
60 | val _ = | |
61 | fn x => | |
62 | let | |
63 | val _: string = #1 x | |
64 | fun id z = z | |
65 | fun g () = | |
66 | let | |
67 | val (_, a) = x | |
68 | in a | |
69 | end | |
70 | in | |
71 | g () | |
72 | end | |
73 | (* flexrecord6 *) | |
74 | ||
75 | (* flexrecord7 *) | |
76 | val _ = | |
77 | let | |
78 | fun f r = { a = #a r, b = #b r } | |
79 | val _ = f { a = 0.0, b = 0.0 } | |
80 | in | |
81 | () | |
82 | end | |
83 | (* flexrecord7 *) | |
84 | ||
85 | (* flexrecord8 *) | |
86 | val _ = | |
87 | fn _ => | |
88 | let | |
89 | val f = #foo | |
90 | val g = (fn x => x) f | |
91 | val _ = f {foo=0, bar=1} | |
92 | in | |
93 | () | |
94 | end | |
95 | (* flexrecord8 *) | |
96 | ||
97 | (* flexrecord9 *) | |
98 | val g = fn {...} => () | |
99 | and h = fn () => () | |
100 | val () = (h (); g {a = 13}) | |
101 | (* flexrecord9 *) |