6

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

如果我只是在我的顶级文件中,我会有模块 Hello(Blah: Blah_type) = struct val x = 2 end

但是我如何将论点放在 hello.ml 中?我不能只是让整个文件成为“val x = 2”......?

4

3 回答 3

6

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

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

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

于 2012-04-11T16:25:34.340 回答
4

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

于 2012-04-11T16:24:12.590 回答
3

foo.ml用真实的代码示例而不是包含内容的文件来补充 ygrek 的答案

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 : S或是M : Hello.S可选的(无论如何传递给函子时 M 将被强制到此签名),这只是为了说明如何做到这一点。

于 2012-04-12T11:18:16.950 回答