OCaml中单独文件中的函子?

时间:2012-04-11 16:00:43

标签: ocaml functor

我想要一个大函子Hello(Blah:Blah_type)并将其保存在文件hello.ml中,但我该怎么做?

如果我只是在我的顶级档案中,我会有     模块Hello(Blah:Blah_type)=       结构         val x = 2       端

但如何将参数放在hello.ml中?我不能让整个文件都是“val x = 2”......?

3 个答案:

答案 0 :(得分:6)

OCamlPro有一个编译器补丁和外部工具,可以支持这个:

http://www.ocamlpro.com/blog/2011/08/10/ocaml-pack-functors.html

据我所知,官方编译器版本不支持.ml文件作为仿函数。

答案 1 :(得分:4)

这是不可能的。源文件始终表示为普通模块,而不是仿函数。这可以通过一个额外的开放来解决。

答案 2 :(得分:3)

使用实际代码示例来补充ygrek的答案,而不是带有内容的文件foo.ml

module type S = sig
  (* ... *)
end

module Hello (M : S) = struct
  (* ... *)
end

module M : S = struct
  (* ... *)
end

module H = Hello(M)

(* ... *)

您可以hello.ml包含内容

module type S = sig
  (* ... *)
end

module Make (M : S) = struct
  (* ... *)
end

foo.ml重写为

module M : Hello.S = struct
  (* ... *)
end

module H = Hello.Make(M)

(* ... *)

PS:如果您发现它令人困惑,密封M : SM : Hello.S的模块是可选的(无论如何,当传递给仿函数时,M将被强制转换为此签名),它只是为了展示如何这可以做到。