如何访问另一个.ml文件中一个.ml文件中定义的类型

时间:2010-05-12 12:02:37

标签: ocaml

在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,我不知道编译错误。

2 个答案:

答案 0 :(得分:7)

编译器 能够识别A.t以从文件t指定类型a.ml

另一方面,t x t是一个类型而x变量不是有效的表达式。这是您的问题的根源。编译器在t导出的变量中查找名称a.ml。由于找不到用于变量的名称,因此会报告错误。

现在你要做的是:

  • 类型注释不是OCaml中编译器的提示。它有一个算法来推断(最常见的,有些例外我没有进入)类型,然后它会检查你的注释是否至少是最常见类型的特殊化。您提供的类型注释永远不会(再次,与您无关的一些可能的例外情况)让它改变主意。

  • 要在文件b.ml中访问类型为f的记录r的字段A.t,请键入r.A.f

    < / LI>

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