【问题标题】:OCaml refer to module in ml file inside mliOCaml 引用 mli 内的 ml 文件中的模块
【发布时间】:2016-08-15 08:41:31
【问题描述】:

这里我有一个文件set.ml,其中有一个名为IntSet 的模块。怎么引用对应接口文件set.mli里面的模块IntSet

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 中定义的模块,以便在定义中使用它?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    我把 set.mli 改成了这个,编译器看起来很开心:

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

    可能还有更多的工作可以使东西可用。例如,无法创建 IntSet.t 类型的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多