在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
吗?
答案 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"}