两个记录中的两个字段在OCaml中具有相同的标签

时间:2012-01-19 15:46:20

标签: types ocaml record

我定义了两种记录类型:

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,这会使编译器混淆。

3 个答案:

答案 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