【问题标题】:I don't agree with this type inference我不同意这种类型推断
【发布时间】:2013-05-02 02:24:02
【问题描述】:

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

【问题讨论】:

  • "我不同意类型检查器所说的" => "我的程序是错误的"。

标签: types ocaml type-inference


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多