我定义了两种记录类型如下:
(* in module A*)
type reg = {name: string; mutable value: Big_int.big_int}
type exp = Reg of reg | Other
(* in module B*)
type abstr = Top | Bot | Elt of int
type register = {name: string; mutable value: abstr}
在模块B中,我有l
的{{1}}列表,我正在进行模式匹配。所以我有这样的事情:
exp
但是我收到以下错误:表达式具有类型A.reg但是期望类型为register 。模块A中的定义似乎被模块B中的定义隐藏。如果是,为什么会这样?有人可以解释一下吗?
答案 0 :(得分:5)
要使用模块中的记录字段名称,您需要输入:
value.Module.field
在你的情况下,它将是:
r.A.name
我认为Deokhwan Kim也是对的,你想A.Reg
而不是A.reg
。
回答“为什么会这样”:获得(精彩和奇妙)类型推断的传统是编译器不能从事物的类型中推断出重载名称的含义。推论是另一种方式(实质上)。因此,您无法根据类型区分名为name
的两个字段,您需要明确指出您的意思。类似的限制表现在整数和浮动算术运算符之间的区别。
答案 1 :(得分:5)
记录无法在OCaml中共享字段名称。记录类型exp
中字段的全名是A.name
和A.value
。与模块A中的其他命名元素一样,您可以省略A.
前缀。但是,在不同的模块中,您必须使用完全限定名称(除非您已打开A
)。换句话说,请写r.A.name
来解决您的错误。