记录标签必须全球唯一吗?

时间:2012-02-27 20:11:39

标签: ocaml

  

可能重复:
  Two fields of two records have same label in OCaml

在Ocaml 3.12.0中,记录的任何标签是否必须具有全局唯一名称?

type foo = { a : int; b : char; }
# type bar = {a : int; b : string};;
type bar = { a : int; b : string; }
# {a=3; b='a'};;
  {a=3; b='a'};;
Error: This expression has type char but an expression was expected of type
         string

我想如果记录是匿名创建的,那么编译器知道我所指的是哪种类型的唯一方法就是记录名称。声明bar隐藏foo吗?

1 个答案:

答案 0 :(得分:7)

不,记录标签不必全局唯一。但它们必须在模块级别上是独一无二的。

声明bar不会隐藏foo;因此,在引用b字段时,类型推断会被破坏。

您可以轻松创建子模块并使用模块名称来区分具有相同标签的记录:

module Foo = struct
  type foo = {a: int; b: char}
end

module Bar = struct
  type bar = {a: int; b: string}
end

let f = {Foo.a = 3; b = 'a'} (* Note that we only need to use module name once *)
let b = {Bar.a = 3; b = "a"}