将模块传递给其他模块

时间:2018-08-06 14:38:28

标签: module ocaml mirage first-class-modules

我正在尝试将Irmin与MirageOS一起使用,并且正在为所有这些模块苦苦挣扎。 我查看了Canopy来源,试图弄清楚应该如何使用Irmin,我知道了:

let start console clock resolver conduit =
  let (module Context) = Irmin_mirage.context (resolver, conduit) in
  let module Mirage_git_memory = Irmin_mirage.Git.Mem.KV(Context)(Git.Inflate.M) in
  let module Store = Mirage_git_memory(Irmin.Contents.String) in
  [...]

在启动功能中,我可以使用Store fine,设置和读取存储库.. 我如何通过商店?由于所有这些类型都取决于start的参数,因此我无法(或不知道如何)在其他任何地方定义这些模块,并且我在所有其他地方传递或定义Store的尝试均因关于构造函数的错误而失败,这些错误会导致构造函数无法转义范围。 我确实设法创建了一个自己的store.ml文件(例如在Canopy中),但是它只是将问题转移到一个新模块中,我仍然不知道如何传递它。

在树冠中,他们似乎仅从start函数开始使用Store模块,这对于他们来说是很好的用途,但不是我想做的。

我正在尝试使用Irmin,但我认为这不是Irmin问题,关于模块系统在ocaml中的工作方式,我可能很错。当我尝试将其传递给另一个函数或模块时,我会遇到类似

的错误
The signature for this packaged module couldn't be inferred.

这似乎合乎逻辑,但我不知道该如何解决。

谢谢

1 个答案:

答案 0 :(得分:2)

对于OCaml编译器来说,一流的模块(例如let (module Context))有点难处理,尤其是它通常无法自行推断其类型。

解决方案是添加手动注释:

let (module Context : Irmin_mirage.CONTEXT) = Irmin_mirage.context (resolver, conduit) in
...