@@ -122,6 +122,24 @@ and paths_row ta ps = function
122
122
ts1 @ ts2
123
123
124
124
125
+ let rec_from_extyp typ label s =
126
+ match s with
127
+ | ExT ([] , t ) ->
128
+ let rec find_rec = function
129
+ | AppT (t , ts ) ->
130
+ let rec_t, unroll_t, roll_t, ak = find_rec t in
131
+ rec_t, AppT (unroll_t, ts), AppT (roll_t, ts), ak
132
+ | RecT (ak , unroll_t ) as rec_t ->
133
+ rec_t, unroll_t, rec_t, ak
134
+ | _ ->
135
+ error typ.at (" non-recursive type for " ^ label ^ " :\n "
136
+ ^ " " ^ Types. string_of_extyp s) in
137
+ find_rec t
138
+ | _ ->
139
+ error typ.at (" non-recursive type for " ^ label ^ " :\n "
140
+ ^ " " ^ Types. string_of_extyp s)
141
+
142
+
125
143
(* Instantiation *)
126
144
127
145
let rec instantiate env t e =
@@ -386,15 +404,18 @@ Trace.debug (lazy ("[FunE] env =" ^ VarSet.fold (fun a s -> s ^ " " ^ a) (domain
386
404
387
405
| EL. RollE (var , typ ) ->
388
406
let s, zs1 = elab_typ env typ l in
389
- let t, ak, t' =
390
- match s with
391
- | ExT ([] , (RecT(ak , t' ) as t )) -> t, ak, t'
392
- | _ -> error typ.at " non-recursive type for rolling" in
407
+ let rec_t, unroll_t, roll_t, ak = rec_from_extyp typ " rolling" s in
408
+ let var_t = lookup_var env var in
409
+ let unroll_t = subst_typ (subst [ak] [rec_t]) unroll_t in
393
410
let _, zs2, f =
394
- try sub_typ env (lookup_var env var) (subst_typ (subst [ak] [t]) t') []
395
- with Sub e -> error var.at (" rolled value does not match annotation" ) in
396
- ExT ([] , t), Pure , zs1 @ zs2,
397
- IL. RollE (IL. AppE (f, IL. VarE (var.it)), erase_typ t)
411
+ try sub_typ env var_t unroll_t []
412
+ with Sub e ->
413
+ error var.at (" rolled value does not match annotation:\n "
414
+ ^ " " ^ Types. string_of_typ var_t ^ " \n "
415
+ ^ " vs\n "
416
+ ^ " " ^ Types. string_of_typ unroll_t) in
417
+ ExT ([] , roll_t), Pure , zs1 @ zs2,
418
+ IL. RollE (IL. AppE (f, IL. VarE (var.it)), erase_typ roll_t)
398
419
399
420
| EL. IfE (var , exp1 , exp2 , typ ) ->
400
421
let t0, zs0, ex = elab_instvar env var in
@@ -489,13 +510,15 @@ Trace.debug (lazy ("[UnwrapE] s2 = " ^ string_of_norm_extyp s2));
489
510
490
511
| EL. UnrollE (var , typ ) ->
491
512
let s, zs1 = elab_typ env typ l in
492
- let t, ak, t' =
493
- match s with
494
- | ExT ([] , (RecT(ak , t' ) as t )) -> t, ak, t'
495
- | _ -> error typ.at " non-recursive type for rolling" in
496
- let _, zs2, f = try sub_typ env (lookup_var env var) t [] with Sub e ->
497
- error var.at (" unrolled value does not match annotation" ) in
498
- ExT ([] , subst_typ (subst [ak] [t]) t'), Pure , zs1 @ zs2,
513
+ let rec_t, unroll_t, roll_t, ak = rec_from_extyp typ " unrolling" s in
514
+ let var_t = lookup_var env var in
515
+ let _, zs2, f = try sub_typ env var_t roll_t [] with Sub e ->
516
+ error var.at (" unrolled value does not match annotation:\n "
517
+ ^ " " ^ Types. string_of_typ var_t ^ " \n "
518
+ ^ " vs\n "
519
+ ^ " " ^ Types. string_of_typ roll_t) in
520
+ let unroll_t = subst_typ (subst [ak] [rec_t]) unroll_t in
521
+ ExT ([] , unroll_t), Pure , zs1 @ zs2,
499
522
IL. UnrollE (IL. AppE (f, IL. VarE (var.it)))
500
523
501
524
| EL. RecE (var , typ , exp1 ) ->
0 commit comments