我不同意这种类型的推断

时间:2013-05-02 02:24:02

标签: types ocaml type-inference

我正在尝试在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),这应该是一种运动(我的类型)。错误是折叠左边的函数(typecheck ce (matchtype tenv cp etype))评估为一个motype,这并不奇怪,但预期的类型是mopat * moexpr - mopat是我的模式类型。折叠左操作的值不应该是基类型和函数返回类型吗?

1 个答案:

答案 0 :(得分:3)

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

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