在a.ml中,定义了记录类型t,并且也是透明定义的 在a.mli中,即在d接口中,以便可以使用类型定义 到所有其他文件。
a.ml还有一个函数func,它返回一个t列表。
现在在另一个文件中,b.ml我正在调用func,现在显然是ocaml 编译器wud无法推断存储在d列表中的d类对象, 对于编译器它只是一个列表。所以在b.ml中,我喜欢dis,
let tlist = A.func in
let vart = List.hd tlist in
printf "%s\n" vart.name (*name is a field in record t*)
现在我在这里得到一个编译器错误,说“未绑定的记录字段标签” 名称“这是有道理的,因为编译器无法推断d型镖。
我的第一个问题:我如何明确地提供d类型的vart作为t 这里? 我试着做“让vart:A.t =”但是得到了 同样的错误。
我还尝试创建另一个函数来获取d的第一个元素 列表并提到返回类型为A.t,但后来我得到了“Unbound” 价值A.t“。我这样做了:
let firstt = function
[] -> 0
| x :: _ -> A.t x ;;
问题是编译器无法识别b.ml中的A.t(一种类型) 但是能够识别函数A.func。如果我删除A.t b.ml,我不知道编译错误。
答案 0 :(得分:7)
编译器 能够识别A.t
以从文件t
指定类型a.ml
。
另一方面,t x
t
是一个类型而x
变量不是有效的表达式。这是您的问题的根源。编译器在t
导出的变量中查找名称a.ml
。由于找不到用于变量的名称,因此会报告错误。
现在你要做的是:
类型注释不是OCaml中编译器的提示。它有一个算法来推断(最常见的,有些例外我没有进入)类型,然后它会检查你的注释是否至少是最常见类型的特殊化。您提供的类型注释永远不会(再次,与您无关的一些可能的例外情况)让它改变主意。
要在文件b.ml
中访问类型为f
的记录r
的字段A.t
,请键入r.A.f
。
答案 1 :(得分:0)
let tlist = A.func in
let vart = List.hd tlist in
printf "%s\n" vart.name (*name is a field in record t*)
此处tlist
是一个函数,我认为它的类型为'a -> A.t list
,但是当您编写List.hd
时,您正在对该函数应用let vart = List.hd tlist
。
您应该为函数提供参数以获取A.t
的列表,例如let tlist = A.func (your_argument-s-_here)
,我想这是您的错误的来源,编译器能够推断模块之间的类型。 / p>