在a.ml中,定义记录类型t,并且也在a.mli中透明地定义,即在d接口中,以便类型定义可用于所有其他文件.
a.ml还有一个函数func,它返回一个t列表.
现在在另一个文件中,b.ml即可调用func,现在很明显ocaml编译器wud nt能够推断存储在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*)
Run Code Online (Sandbox Code Playgroud)
现在我在这里得到一个编译器错误,说"未绑定记录字段标签名称",这是有道理的,因为编译器无法推断d类型的镖.
我的第一个问题:如何在这里明确提供d型镖?我试着做"让vart:At ="但是得到了同样的错误.
我还尝试创建另一个函数来获取d列表的第一个元素并将返回类型提到At,但后来我得到了"Unbound value At".我这样做了:
let firstt = function
[] -> 0
| x :: _ -> A.t x ;;
Run Code Online (Sandbox Code Playgroud)
问题是编译器无法识别b.ml中的At(a type)但是能够识别函数A.func.如果我从b.ml中删除At,我不会遇到任何编译器错误.
编译器是能够识别A.t指定类型t的文件a.ml.
另一方面,类型和变量t x在哪里不是有效表达式.这是您的问题的根源.编译器在导出的变量中查找名称.由于找不到用于变量的名称,因此报告错误.txta.ml
现在你要做的是:
类型注释不是OCaml中编译器的提示.它有一个算法来推断(最常见的,有些例外我没有进入)类型,然后它检查你的注释是否至少是最常见类型的特殊化.您提供的类型注释永远不会(再次,与您无关的一些可能的例外情况)让它改变主意.
要在文件中访问类型记录b.ml的字段,请键入.frA.tr.A.f
| 归档时间: |
|
| 查看次数: |
2690 次 |
| 最近记录: |