OCaml开发:模块间类型不匹配错误排查求助
OCaml类型错误原因分析
问题代码片段
ast.ml
type fundef = FunDef of string * string list * expr
interpreter.ml
let interp_fundef (d: Ast.fundef) (g: FStore.t) : FStore.t = match d with | Ast.FunDef (x, pl, e) -> (FStore.add x (pl * e) g)
fStore.ml
module M = Map.Make(String) type t = (string list * Ast.expr) M.t let add = M.add let mem = M.mem let find = M.find let empty = M.empty
错误原因
编译报错的核心是运算符误用导致的类型不匹配:
- OCaml中
*是整数乘法运算符,仅接受int类型的左右操作数。 - 代码里的
pl是string list类型,e是Ast.expr类型,用*连接它们时,编译器会强制要求pl转为int类型以满足乘法运算的类型要求,但显然无法完成转换,因此抛出类型错误。
你实际想要构造的是FStore.t要求的(string list * Ast.expr)元组,元组的构造应该用逗号,而非*。
修正后的代码
将interpreter.ml中的错误行修改为:
FStore.add x (pl, e) g
内容的提问来源于stack exchange,提问作者Gamja
相关产品推荐
相关产品推荐

