OCaml中分别存储Functors的方法是什么?

7
我想要一个大的函数对象Hello(Blah: Blah_type),并将其保存在hello.ml文件中,但是我该如何做呢?
如果我只是在我的顶层文件中,我会有以下代码:
module Hello(Blah: Blah_type) = struct val x = 2 end
但是如何在hello.ml文件中传递参数呢?我不能让整个文件都是"val x = 2"吧...?
3个回答

6

当一个人想要将一个functor分割成几个编译单元时,bigfunctor补丁非常有用。然而,在这里,只需要将functor包装为单个编译单元的模块项即可,使用bigfunctor补丁就过于复杂了。 - gasche
我理解这个问题是想要避免在Hello.Make(...)中使用Make。修补程序和ocp-pack可能是繁琐的方法,但据我所知,它们目前是唯一可用的方法。 - hcarty

5
为了补充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将被强制转换为此签名),这只是为了展示如何完成此操作。


4

很遗憾,不可能实现。源文件总是被表示为普通的模块,而不是 functors(译者注:Functors 是 OCaml 中的一个特性)。通过多加一个 open 语句可以轻松解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接