2016-08-14 34 views
2

这里我有一个文件set.ml带有一个叫做IntSet的模块。我如何参考相应接口文件set.mli中的模块IntSetOCaml是指mli里面的ml文件模块

module IntSet = struct 
    type t = int list;; 
    let empty = [];; 
    let rec is_member key = function 
    | [] -> false 
    | (x::xs) -> (
     if x = key then true 
     else is_member key xs 
    );; 
end;; 

let join xs ys = xs @ ys;; 

这里是set.mli

val join : IntSet.t -> IntSet.t -> IntSet.t

如果我尝试编译它,我得到一个错误,声称模块IntSet绑定。

% corebuild set.native 
+ ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -bin-annot -short-paths -thread -package core -ppx 'ppx-jane -as-ppx' -o set.cmi set.mli 
File "set.mli", line 1, characters 11-19: 
Error: Unbound module IntSet 
Command exited with code 2. 
Hint: Recursive traversal of subdirectories was not enabled for this build, 
    as the working directory does not look like an ocamlbuild project (no 
    '_tags' or 'myocamlbuild.ml' file). If you have modules in subdirectories, 
    you should add the option "-r" or create an empty '_tags' file. 

    To enable recursive traversal for some subdirectories only, you can use the 
    following '_tags' file: 

     true: -traverse 
     <dir1> or <dir2>: traverse 

Compilation unsuccessful after building 3 targets (1 cached) in 00:00:00. 

如何公开在set.ml中定义的模块,以便我可以在定义中使用它?

回答

2

我改变set.mli此,编译器似乎高兴:

module IntSet : sig type t end 
val join : IntSet.t -> IntSet.t -> IntSet.t 

有可能是更多的工作,以使事情变得可用。例如,无法创建类型为IntSet.t的值。