我想要一个大函子 Hello(Blah: Blah_type) 并将其保存在文件 hello.ml 中,但我该怎么做呢?
如果我只是在我的顶级文件中,我会有模块 Hello(Blah: Blah_type) = struct val x = 2 end
但是我如何将论点放在 hello.ml 中?我不能只是让整个文件成为“val x = 2”......?
OCamlPro 有一个编译器补丁和外部工具可以支持这个:
http://www.ocamlpro.com/blog/2011/08/10/ocaml-pack-functors.html
据我所知,官方编译器版本不支持将 .ml 文件作为函子。
这不可能。源文件始终表示为普通模块,而不是仿函数。这可以通过一个额外的打开来轻松解决。
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 将被强制到此签名),这只是为了说明如何做到这一点。