Ocaml 如何对付那些函子

Ocaml 如何对付那些函子,ocaml,mirage,Ocaml,Mirage,我来这里是为了别的事情,但我想写下我的问题,我意识到我不可能做得对。 我使用mirage和irmin已经有一段时间了,只要所有代码都留在主模块中,一切都很好。但当然,它很快就变成了一个巨大得可笑的文件,试图将其拆分成模块让我为类型逃离其作用域之类的事情而发疯 我必须将这些其他函数放在一个functor中,该functor将接受Mirage\u types\u lwt.console以及实际的console变量,这意味着所有东西最终都在从一开始就实例化的functor中,并在一堆无法读取的代码中传

我来这里是为了别的事情,但我想写下我的问题,我意识到我不可能做得对。 我使用mirage和irmin已经有一段时间了,只要所有代码都留在主模块中,一切都很好。但当然,它很快就变成了一个巨大得可笑的文件,试图将其拆分成模块让我为类型逃离其作用域之类的事情而发疯

我必须将这些其他函数放在一个functor中,该functor将接受
Mirage\u types\u lwt.console
以及实际的console变量,这意味着所有东西最终都在从一开始就实例化的functor中,并在一堆无法读取的代码中传递

我在制作一个巨大而丑陋的模块来轻松存储和传递所有这些(将需要这些混乱的部分与常规代码“隔离”)时遇到了问题,我不知道如何声明这样的东西:

module type ContextConfig = sig
  module Store
  val clientctx : Client.ctx
  ....
end

let mkContextConfig (module Store : Repo) ctx =
  (module struct
    (module Store : Repo)
    let clientctx = ctx
  end : ContextConfig)
(Repo是我用来环绕Irmin函子的一个模块)。 这显然不起作用,我尝试了很多语法,我猜这是不可能的,这意味着我做了一些非常错误的事情


我想知道如何以一种干净的方式处理所有这些functor和类型,如何传递诸如控制台或管道之类的东西,而不必对主模块中的所有东西进行函数化和实例化,然后再传递?

这样的定义是可能的:

module type REPO = sig end

module type CONTEXT_CONFIG = sig
  module Store : REPO
  val client_ctx : int
end

let mkContextConfig (module Store : REPO) ctx =
  (module struct
    module Store = Store
    let client_ctx = ctx
  end : CONTEXT_CONFIG)

(进行一些无趣的更改以进行代码类型检查。)

这样的定义是可能的:

module type REPO = sig end

module type CONTEXT_CONFIG = sig
  module Store : REPO
  val client_ctx : int
end

let mkContextConfig (module Store : REPO) ctx =
  (module struct
    module Store = Store
    let client_ctx = ctx
  end : CONTEXT_CONFIG)

(进行一些无趣的更改以进行代码类型检查。)

确实可以编译。我确信我测试了这个语法。。我的错。谢谢这确实是一个问题。我确信我测试了这个语法。。我的错。谢谢