我正在尝试在 OCaml 中编写 OCaml 评估器。基本上我需要模仿 OCaml 的类型检查器。我有以下代码,它应该返回一个类型,但编译器抱怨类型不匹配。
let rec typecheck (expr:moexpr) (tenv:type environment) =
match expr with
| ...
| Match(e, (pat, exp)::l) -> let etype=(typecheck e tenv) in
(List.fold_left (fun (cp, ce) fp -> (typecheck ce (matchtype tenv cp etype)))
(typecheck exp tenv) (pat, exp)::l)
在我的左侧折叠中,我给出了(typecheck exp tenv)
应该是 motype(我的类型类型)的基础。错误是 fold left 函数(typecheck ce (matchtype tenv cp etype))
计算为 motype,这并不奇怪,但预期的类型是 mopat * moexpr - mopat 是我的模式类型。左折叠操作的值不应该是基本类型和函数返回类型吗?