2014-09-05 31 views
2

使用opam安装的ocaml 4.01.0和核心111.17.00。ocaml嵌套模块:执行ml与接口不匹配cmi

我有两个可能相关的问题,我已经归结为以下简化模块。

我有一个外部模块(Zee在这里),包含一个内部模块(Foo)。我的主程序是在xx.ml.

的第一个问题是,当我建立使用corebuild xx.byte,我得到错误信息:

File "zee.ml", line 1: 
Error: The implementation zee.ml does not match the interface zee.cmi: 
     The field `Foo' is required but not provided 

第二个问题,这可能源于无论我做错造成的错误,就是如果我取消了注释掉的代码xx.ml下面,我得到:

File "xx.ml", line 3, characters 23-32: 
Error: Unbound module Zee.Foo 

我是新来OCaml的,但我有其他的代码,这似乎是工作嵌套模块。我一直无法弄清楚导致这些错误的情况有什么不同。是否有关于在我缺少的其他模块中声明模块签名的内容?

下面是代码(单独的文件由标题所示):

(**** zee.mli ****) 
module type Foo = sig 
    val x : int 
end 

val bar : int 

(**** zee.ml ****) 
module Foo = struct 
    let x = 10 
end 

let bar = 20 

(**** xx.ml ****) 
open Core.Std 

(* 
let() = printf "%d\n" Zee.Foo.x 
*) 

let() = 
    printf "%d\n" Zee.bar 

从corebuild完整的输出与上面完全相同的代码:

bash# rm -rf _build && corebuild xx.byte 
ocamlfind ocamldep -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -modules xx.ml > xx.ml.depends 
ocamlfind ocamldep -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -modules zee.mli > zee.mli.depends 
ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o zee.cmi zee.mli 
ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o xx.cmo xx.ml 
ocamlfind ocamldep -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -modules zee.ml > zee.ml.depends 
ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o zee.cmo zee.ml 
+ ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o zee.cmo zee.ml 
File "zee.ml", line 1: 
Error: The implementation zee.ml does not match the interface zee.cmi: 
     The field `Foo' is required but not provided 
Command exited with code 2. 

回答

5

这是因为你说

module type Foo = 
sig 
    val x : int 
end 

虽然你的意思是

module Foo : 
sig 
    val x : int 
end 

第一条语句声明了一个模块类型Foo和指定(注意,使用了=迹象让人想起了绑定的),该模块类型的签名。模块类型可用于specify the expected signature of arguments to a functorfilter the signature of a module implementing a superset of Foo

第二条语句声明了一个模块Foo并指定(请注意使用的:性格让人想起了约束类型的)这个模块的签名。

File "zee.ml", line 1: 
Error: The implementation zee.ml does not match the interface zee.cmi: 
     The field `Foo' is required but not provided 

这是因为你答应在你没有在实现文件实现接口文件模块类型Foo - 而不是你实现了一个模块这个接口。

File "xx.ml", line 3, characters 23-32: 
Error: Unbound module Zee.Foo 

这是因为模块定义是由您的接口文件隐藏。

+0

感谢您指出的区别。现在我明白为什么我在我的大型项目中遇到问题。 – bstpierre 2014-09-05 11:51:13