首页 > 解决方案 > 如何处理所有这些函子

问题描述

我来这里是为了别的事情,但试图写下我的问题,我意识到我做这件事是不可能的。我已经使用 mirage 和 irmin 有一段时间了,只要所有代码都保留在 Main 模块中,一切都很好。但是,当然,它很快就变成了一个大得离谱的文件,并且试图将它拆分为模块让我对逃避其范围的类型和诸如此类的东西感到抓狂。

除了将控制台从 start 传递给其他一些函数之外,我还必须将这些其他函数放在一个仿函数中,该仿函数将采用Mirage_types_lwt.CONSOLE实际的控制台变量,这意味着一切最终都在从 start 实例化的仿函数中并在一个无法阅读的混乱代码。

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

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 的函子而制作的一个模块)。这显然行不通,我尝试了很多语法,我猜这是不可能的,这意味着我做错了什么?

我希望以正确的方式以干净的方式处理所有这些函子和类型的建议,我如何传递控制台或管道之类的东西,而不必为了传递它而对 Main 模块中的所有内容进行函数化和实例化之后?

标签: ocamlmirage

解决方案


这样的定义是可能的:

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)

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


推荐阅读