@@ -59,6 +59,112 @@ PolyRec = {
59
59
t0 = @(t int) (right (@(t (type (int, int))) (left (0, 0))));
60
60
};
61
61
62
+ ;;
63
+
64
+ IT = data case t _ :> {
65
+ Int : Int.t -> case Int.t;
66
+ Text : Text.t -> case Text.t;
67
+ };
68
+
69
+ IT = let
70
+ type I (type t _) (type case _) = {
71
+ Int : Int.t -> case Int.t;
72
+ Text : Text.t -> case Text.t;
73
+ };
74
+ type J (type t _) = {type case _; ...I t case};
75
+ type T (type t _) x = (c: J t) -> c.case x;
76
+ ...{
77
+ t = rec (type t _) => fun (type x) => type wrap T t x;
78
+ case 'x (type case _) (cs: I t case) e =
79
+ (unwrap e.@(t _): wrap T t x) {case; ...cs};
80
+ mk 'x (c: T t x) = @(t x) (wrap c: wrap T t x);
81
+ } :> {
82
+ type t _;
83
+ case 'x: (type case _) => I t case => t x -> case x;
84
+ mk 'x: T t x => t x;
85
+ };
86
+ J = J t;
87
+ in {
88
+ t; case;
89
+ Int v = mk (fun (r: J) => r.Int v);
90
+ Text v = mk (fun (r: J) => r.Text v);
91
+ };
92
+
93
+ IT = {
94
+ ...IT;
95
+
96
+ impossible: t int -> int = case (fun (type t) => t) {
97
+ Int x = x;
98
+ Text x = x;
99
+ };
100
+
101
+ i: int = impossible (Int 9);
102
+ ;;t: text = impossible (Text "nine");
103
+ };
104
+
105
+ ;;
106
+
107
+ Ord = data case t :> {
108
+ Lt : case;
109
+ Eq : case;
110
+ Gt : case;
111
+ };
112
+
113
+ Opt = data case t x :> {
114
+ None : case;
115
+ Some : x -> case;
116
+ };
117
+
118
+ Alt = {
119
+ ...data case t l r :> {
120
+ Left : l -> case;
121
+ Right : r -> case;
122
+ };
123
+
124
+ ;;Left 'l 'r (v: l) = mk (fun (r: J t l r) => r.Left v);
125
+ ;;Right 'l 'r (v: r) = mk (fun (r: J t l r) => r.Right v);
126
+ };
127
+
128
+ List = let
129
+ ...let
130
+ type I (type case) (type t _) x = {
131
+ nil : case;
132
+ (::) 'n : x -> t x -> case;
133
+ };
134
+ type J (type t _) x = {type case; ...I case t x};
135
+ type T (type t _) x = (c: J t x) -> c.case;
136
+ in {
137
+ t = rec (type t _) => fun (type x) => type wrap T t x;
138
+ case '(type case) 'x 'n (cs: I case t x) (e: t x) =
139
+ (unwrap e.@(t x): wrap T t x) {case; ...cs};
140
+ mk 'x (c: T t x) = @(t x) (wrap c: wrap T t x);
141
+ D = J t;
142
+ } :> {
143
+ type t _;
144
+ case '(type case) 'x 'n: I case t x => t x -> case;
145
+ mk 'x: T t x => t x;
146
+ type D x = J t x;
147
+ };
148
+ in {
149
+ t; case;
150
+ nil 'x = mk (fun (r: D x) => r.nil);
151
+ (::) 'x 'n (v: x) (vs: t x) = mk (fun (r: D x) => r.:: v vs);
152
+ };
153
+
154
+ List' = {
155
+ ...data case t x :> {
156
+ nil : case;
157
+ (::) : x -> t x => case;
158
+ };
159
+
160
+ ;; nil 'x = mk (fun (r: J x) => r.nil);
161
+ ;; (::) 'x (v: x) (vs: t x) = mk (fun (r: J x) => r.:: v vs);
162
+
163
+ isEmpty = case {nil = true; (::) _ _ = false};
164
+ };
165
+
166
+ ;;
167
+
62
168
N :> {
63
169
type Z;
64
170
type S _;
@@ -67,38 +173,81 @@ N :> {
67
173
type S _ = {};
68
174
};
69
175
176
+ ListN'' = let
177
+ type I (type case _) (type t _ _) x = {
178
+ nil : case N.Z;
179
+ (::) 'n : x -> t x n -> case (N.S n);
180
+ };
181
+ type J (type t _ _) x = {type case _; ...I case t x};
182
+ type T (type t _ _) x n = (c: J t x) -> c.case n;
183
+ in {
184
+ t = rec (type t _ _) => fun (type x) (type n) => type wrap T t x n;
185
+ case (type case _) 'x 'n (cs: I case t x) (e: t x n) =
186
+ (unwrap e.@(t x n): wrap T t x n) {case; ...cs};
187
+ mk 'x 'n (c: T t x n) = @(t x n) (wrap c: wrap T t x n);
188
+ D = J t;
189
+ } :> {
190
+ type t _ _;
191
+ case (type case _) 'x 'n: I case t x => t x n -> case n;
192
+ mk 'x 'n: T t x n => t x n;
193
+ type D x = J t x;
194
+ };
195
+
70
196
ListN = let
71
- type I (type x) (type p _ _) (type t _ _) = {
72
- nil : p x N.Z;
73
- (::) 'n : x -> t x n -> p x (N.S n);
197
+ ...let
198
+ type I (type case _) (type t _ _) x = {
199
+ nil : case N.Z;
200
+ (::) 'n : x -> t x n -> case (N.S n);
201
+ };
202
+ type J (type t _ _) x = {type case _; ...I case t x};
203
+ type T (type t _ _) x n = (c: J t x) -> c.case n;
204
+ in {
205
+ t = rec (type t _ _) => fun (type x) (type n) => type wrap T t x n;
206
+ case (type case _) 'x 'n (cs: I case t x) (e: t x n) =
207
+ (unwrap e.@(t x n): wrap T t x n) {case; ...cs};
208
+ mk 'x 'n (c: T t x n) = @(t x n) (wrap c: wrap T t x n);
209
+ D = J t;
210
+ } :> {
211
+ type t _ _;
212
+ case (type case _) 'x 'n: I case t x => t x n -> case n;
213
+ mk 'x 'n: T t x n => t x n;
214
+ type D x = J t x;
74
215
};
75
- type T x n (type t _ _) = (type p _ _) => I x p t -> p x n;
76
216
in {
77
- t = rec (type t _ _) => fun (type x) (type n) => type wrap T x n t;
78
-
79
- case 'x 'n (p: {type t _ _}) (cs: I x p.t t) e =
80
- (unwrap e.@(t _ _): wrap T x n t) p.t cs;
81
-
82
- local
83
- mk 'x 'n (c: T x n t) = @(t x n) (wrap c: wrap T x n t);
84
- in
85
- nil 'x = mk (fun (type p _ _) (r: I x p t) => r.nil);
86
- (::) 'x 'n (v: x) (vs: t x n) = mk (fun (type p _ _) (r: I x p t) => r.:: v vs);
87
- end;
88
- } :> {
89
- type t _ _;
90
-
91
- case 'x 'n: (p: {type t _ _}) => I x p.t t => t x n -> p.t x n;
92
-
93
- nil 'x : t x N.Z;
94
- (::) 'x 'n : x => t x n => t x (N.S n);
217
+ t; case;
218
+ nil 'x = mk (fun (r: D x) => r.nil);
219
+ (::) 'x 'n (v: x) (vs: t x n) = mk (fun (r: D x) => r.:: v vs);
95
220
};
96
221
97
222
ListN = {
98
223
...ListN;
99
224
map 'x 'y 'n (xy: x -> y) = rec (map: 'n => t x n -> t y n) =>
100
- case {type t _ n = t y n} {
225
+ case (t y) {
101
226
nil = nil;
102
227
(::) x xs = xy x :: map xs;
103
228
};
229
+ foldLeft 'x 's (sxs: s -> x -> s) = rec (foldLeft: 'n => s -> t x n -> s) => fun v =>
230
+ case (fun (type n) => s) {
231
+ nil = v;
232
+ (::) x xs = foldLeft (sxs v x) xs;
233
+ };
234
+ otw = 1 :: (2 :: (3 :: nil));
235
+ sum = foldLeft (+) 0 otw;
236
+ otw' = map (fun i => "Int.toText missing") otw;
237
+ };
238
+
239
+ ListN' = {
240
+ ...data case t x _ :> {
241
+ nil : case N.Z;
242
+ (::) 'n : x -> t x n -> case (N.S n);
243
+ };
244
+
245
+ ;; nil 'x = mk (fun (r: D x) => r.nil);
246
+ ;; (::) 'x 'n (v: x) (vs: t x n) = mk (fun (r: D x) => r.:: v vs);
247
+ ;;
248
+ ;; map 'x 'y 'n (xy: x -> y) = rec (map: 'n => t x n -> t y n) =>
249
+ ;; case (t y) {
250
+ ;; nil = nil;
251
+ ;; (::) x xs = xy x :: map xs;
252
+ ;; };
104
253
};
0 commit comments