首页 > 解决方案 > Irmin Linked_log 可以与 Git.FS 后端一起使用吗?

问题描述

我想使用Linked_log来自Irmin_containers
https://mirage.github.io/irmin/irmin-containers/Irmin_containers/Linked_log/index.html

提供了两个仿函数来制作Linked_log支持MemFS后端。另外一个Make函子,用于通过传递所有参数来使一个完全可配置的。

我想做一个有Irmin_unix.Git.FS商店支持的。

我正在努力导航类型并找到正确的值以传递给各种仿函数。

现有的 Linked_log FS 仿函数如下所示

module FS (C : Stores.Content_addressable) (V : Irmin.Type.S) () =
  Make (Irmin_unix.FS.KV) (C) (Time.Machine) (Irmin.Hash.SHA1) (V) ()

我想我只想制作自己的“GitFS”仿函数,它看起来几乎相同,但Irmin_unix.Git.FS.KV可以替代Irmin_unix.FS.KV

我的第一个问题是在此文件中找到函子Stores.Content_addressable的 arg 类型: https ://github.com/mirage/irmin/blob/5fd54838c5e8eb9bfa4c02170df30698f78b0201/src/irmin-containers/stores.ml ...但它没有被导出。C

后面有一系列令人费解的包含,但我想我最终找到了可以在我自己的代码中使用的正确签名。我能够定义:

module GitFSLinkedLog_maker (C : Irmin_containers.Cas_maker) (V : Irmin.Type.S) () =
  Irmin_containers.Linked_log.Make (Irmin_unix.Git.FS.KV) (C) (Irmin_containers.Time.Machine) (Irmin.Hash.SHA1) (V) ()

...并且类型检查器可以接受。

我现在的问题是如何使用这个函子。

我相信V应该是这样的Irmin.Content.String。不过,我迷路了C

我想我可以看看他们的测试。例如他们这样做:

module CAS = struct
  include Irmin.Content_addressable.Make (Irmin_mem.Append_only)

  let config = Irmin_mem.config ()
end

module L = Irmin_containers.Linked_log.Mem (CAS) (Irmin.Contents.String) ()

这看起来很有希望。Irmin_containers.Linked_log.Mem相当于我的GitFSLinkedLog_maker. 所以我需要将这样的结构作为C参数传递。

但是,如果我将其复制并粘贴到我自己的代码中,则会出现构建错误:

51 |   include Irmin.Content_addressable.Make (Irmin_mem.Append_only)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The module Irmin.Content_addressable is a functor, it cannot have any components

当它对我来说似乎是非法代码时,这对他们有什么作用?

标签: ocaml

解决方案


推荐阅读