ocaml嵌套模块:实现ml与接口cmi不匹配

bst*_*rre 2 ocaml

使用由opam安装的ocaml 4.01.0和核心111.17.00.

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

我有一个外部模块(Zee here),它包含一个内部模块(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
Run Code Online (Sandbox Code Playgroud)

第二个问题,可能源于我做错导致该错误的任何问题,如果我在下面的xx.ml中取消注释掉注释掉的代码,我得到:

File "xx.ml", line 3, characters 23-32:
Error: Unbound module Zee.Foo
Run Code Online (Sandbox Code Playgroud)

我是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
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

Mic*_*ald 5

这是因为你说的

module type Foo =
sig
  val x : int
end
Run Code Online (Sandbox Code Playgroud)

而你的意思

module Foo :
sig
  val x : int
end
Run Code Online (Sandbox Code Playgroud)

第一个语句声明一个模块类型, Foo并指定(注意使用符合=结合的符号)这个模块类型的签名.然后,模块类型可用于指定仿函数的参数的预期签名,过滤实现超集的模块的签名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
Run Code Online (Sandbox Code Playgroud)

这是因为你答应一个模块类型 Foo中,你并没有在实现文件实现接口文件-而不是你实现一个模块与该接口.

File "xx.ml", line 3, characters 23-32:
Error: Unbound module Zee.Foo
Run Code Online (Sandbox Code Playgroud)

这是因为模块定义被接口文件隐藏.