0

我正在尝试在 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 是我的模式类型。左折叠操作的值不应该是基本类型和函数返回类型吗?

4

1 回答 1

3

由于您正在编写类型检查器,我想我不需要在这里解释类型推断是如何工作的。

检查 fold_left 的类型。它采用一个函数,其第一个元素是累加器,而您的“基础”是初始累加器。您的累加器具有 (cp, ce) 形式,因此其类型为 mopat * moexpr,但您的基础 acc 具有 motype。我想这些论点是错误的。翻转 (cp,ce) 和 fp 然后看起来更好。你还有一个问题,fp,真正的累加器,从来没有使用过。

于 2013-05-02T03:25:34.080 回答