我定义了两种记录类型:
type name =
{ r0: int; r1: int; c0: int; c1: int;
typ: dtype;
uid: uid (* key *) }
and func =
{ name: string;
typ: dtype;
params: var list;
body: block }
我后来遇到一行代码错误:Error: The record field label typ belongs to the type Syntax.func but is mixed here with labels of type Syntax.name
有人可以告诉我,我们是否应该让两个记录中的两个字段具有相同的标签,例如typ
,这会使编译器混淆。
答案 0 :(得分:13)
不,你不能,因为它会打破类型推断。
不过,你可以使用模块命名空间来解决这个问题:module Name = struct
type t = { r0:int; ... }
end
module Func = struct
type t = { name: string; ... }
end
然后,您可以通过正确的模块为字段名称添加前缀:
let get_type r = r.Name.typ
let name = { Name.r0=1; r1=2; ... }
let f = { Func.name="foo"; typ=...; ... }
请注意,您只需要为第一个字段添加前缀,编译器将自动了解您正在编写的值的类型。
答案 1 :(得分:8)
Ocaml语言要求模块内的所有字段具有不同的名称。否则,它将无法推断出以下函数的类型
let get_typ r = r.typ ;;
因为它可以是name -> dtype
类型或类型func -> dtype
顺便说一句,我建议您为所有类型名称添加_t
后缀。
答案 2 :(得分:1)
当编译器无法从重复记录标签推断出类型时,您可以在函数签名中使用类型注释。例如,
let get_name_type (n:name) = n.typ
let get_func_type (f:func) = f.typ