我有以下模块签名A
:
module type A =
sig
type exp =
Int of int
| Var of string
end;;
我可以编译以获取a.mli
和a.cmi
文件。但是,如果我定义B
:
module type B =
sig
val compute : A.exp -> A.exp
end;;
正在运行ocamlc -i b.ml
会产生错误Unbound type constructor A.exp
。那是为什么?
答案 0 :(得分:1)
OCaml为您提供了一个免费的外部模块,对应于每个源文件。所以你要定义一个名为A.A的模块类型。请注意,它是模块类型,而不是模块。
你的a.ml(以及你喜欢的a.mli)可能只包含以下内容:
type exp = Int of int | Var of string
然后你可以从你的b.ml文件中引用A.exp。
另请注意,a.mli是源文件。如果您有a.mli文件,则需要编译它以创建a.cmi。