我正在尝试在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是我的模式类型。折叠左操作的值不应该是基类型和函数返回类型吗?
答案 0 :(得分:3)
由于您正在编写类型检查器,我认为我不需要解释类型推断如何在这里工作。
检查fold_left的类型。它需要一个函数,其第一个元素是累加器,而你的“基数”是初始累加器。你的累加器有形式(cp,ce)所以它的类型是mopat * moexpr,但你的基础acc有motype。我猜这些论点都是错误的。翻转(cp,ce)和fp然后它看起来更好。你仍然有一个fp的问题,真正的累加器,从未使用过。