OCaml中单独文件中的函子?

R u*_*c k 6 ocaml functor

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

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

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

hca*_*rty 6

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

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

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


gas*_*che 5

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

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

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

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

module H = Hello(M)

(* ... *)
Run Code Online (Sandbox Code Playgroud)

你可以有hello.ml内容

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

module Make (M : S) = struct
  (* ... *)
end
Run Code Online (Sandbox Code Playgroud)

foo.ml重写为

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

module H = Hello.Make(M)

(* ... *)
Run Code Online (Sandbox Code Playgroud)

PS:如果你觉得它令人困惑,模块密封M : SorM : Hello.S是可选的(无论如何,当传递给仿函数时,M 将被强制为这个签名),这只是为了展示如何做到这一点。


ygr*_*rek 4

这不可能。源文件始终表示为普通模块,而不是函子。只需额外打开一个即可轻松解决此问题。