@@ -254,12 +254,10 @@ let rec typecheck_pattern (pre : pre) (tyenv : Typeenv.t) ((rng, utpatmain) : un
254
254
return (PConstructor (ctornm, epat1), (rng, DataType (tyargs, tyid)), tyenv1)
255
255
256
256
257
- let typecheck_function_parameter_unit ( pre : pre ) (tyenv : Typeenv.t ) (param_unit : untyped_parameter_unit ) : (pattern_var_map * mono_row * mono_type * EvalVarID.t LabelMap.t * pattern_tree) ok =
257
+ let typecheck_function_parameter_unit ~( cons : label ranged -> mono_type -> 'a -> 'a ) ~( nil : 'a ) ( pre : pre ) (tyenv : Typeenv.t ) (param_unit : untyped_parameter_unit ) : (Typeenv.t * 'a * mono_type * EvalVarID.t LabelMap.t * pattern_tree) ok =
258
258
let open ResultMonad in
259
259
let UTParameterUnit (opt_params, utpat, mnty_opt) = param_unit in
260
260
let (optrow, evid_labmap, tyenv) =
261
- let cons rlabel ty row = (RowCons (rlabel, ty, row)) in
262
- let nil = RowEmpty in
263
261
add_optionals_to_type_environment ~cons ~nil tyenv pre opt_params
264
262
in
265
263
let * (epat, ty_pat, patvarmap) = typecheck_pattern pre tyenv utpat in
@@ -272,31 +270,20 @@ let typecheck_function_parameter_unit (pre : pre) (tyenv : Typeenv.t) (param_uni
272
270
| None ->
273
271
return ()
274
272
in
275
- return (patvarmap, optrow, ty_pat, evid_labmap, epat)
273
+ let tyenv = add_pattern_var_mono pre tyenv patvarmap in
274
+ return (tyenv, optrow, ty_pat, evid_labmap, epat)
276
275
277
276
278
277
let typecheck_abstraction (pre : pre ) (tyenv : Typeenv.t ) (param_units : untyped_parameter_unit list ) : (Typeenv.t * (EvalVarID.t LabelMap.t * pattern_tree * mono_type LabelMap.t * mono_type) list) ok =
279
278
let open ResultMonad in
280
279
let * (tyenv, acc) =
281
280
param_units |> foldM (fun (tyenv , acc ) param_unit ->
282
- let UTParameterUnit (opt_params, utpat, mnty_opt) = param_unit in
283
- let (ty_labmap, evid_labmap, tyenv) =
281
+ let * (patvarmap, ty_labmap, ty_pat, evid_labmap, epat) =
284
282
let cons (_ , label ) ty ty_labmap = ty_labmap |> LabelMap. add label ty in
285
283
let nil = LabelMap. empty in
286
- add_optionals_to_type_environment ~cons ~nil tyenv pre opt_params
284
+ typecheck_function_parameter_unit ~cons ~nil pre tyenv param_unit
287
285
in
288
- let * (pat, ty_pat, patvarmap) = typecheck_pattern pre tyenv utpat in
289
- let * () =
290
- match mnty_opt with
291
- | Some (mnty ) ->
292
- let * typat_annot = ManualTypeDecoder. decode_manual_type pre tyenv mnty in
293
- unify ty_pat typat_annot
294
-
295
- | None ->
296
- return ()
297
- in
298
- let tyenv = add_pattern_var_mono pre tyenv patvarmap in
299
- return (tyenv, Alist. extend acc (evid_labmap, pat, ty_labmap, ty_pat))
286
+ return (tyenv, Alist. extend acc (evid_labmap, epat, ty_labmap, ty_pat))
300
287
) (tyenv, Alist. empty)
301
288
in
302
289
return (tyenv, acc |> Alist. to_list)
@@ -671,11 +658,12 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab
671
658
end
672
659
673
660
| UTFunction (param_unit , utast1 ) ->
674
- let * (patvarmap, optrow, ty_pat, evid_labmap, epat) =
675
- typecheck_function_parameter_unit pre tyenv param_unit
661
+ let * (tyenv, optrow, ty_pat, evid_labmap, epat) =
662
+ let cons rlabel ty row = (RowCons (rlabel, ty, row)) in
663
+ let nil = RowEmpty in
664
+ typecheck_function_parameter_unit ~cons ~nil pre tyenv param_unit
676
665
in
677
666
let * (e1, ty1) =
678
- let tyenv = add_pattern_var_mono pre tyenv patvarmap in
679
667
typecheck pre tyenv utast1
680
668
in
681
669
return (Function (evid_labmap, PatternBranch (epat, e1)), (rng, FuncType (optrow, ty_pat, ty1)))
0 commit comments