我正在尝试将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.
这似乎合乎逻辑,但我不知道该如何解决。
谢谢
答案 0 :(得分:2)
对于OCaml编译器来说,一流的模块(例如let (module Context)
)有点难处理,尤其是它通常无法自行推断其类型。
解决方案是添加手动注释:
let (module Context : Irmin_mirage.CONTEXT) = Irmin_mirage.context (resolver, conduit) in
...