如何处理所有这些函子

时间:2018-10-14 18:20:35

标签: ocaml mirage

我在这里只是想写些其他问题,但我试图写出我的问题,我意识到我无法做到这一点。 我使用Mirage和irmin已有一段时间了,只要所有代码都保留在Main模块中,一切就很好。但是,当然,它很快就变成了一个荒谬的巨大文件,尝试将其拆分为模块会使我为逃避范围和其他类型的类型而发狂。

我不仅要将控制台从头传递到其他功能,还必须将其他功能放在函子中,该函子将使用Mirage_types_lwt.CONSOLE以及实际的控制台变量,这意味着所有内容最终都在函子中从一开始就实例化,并以混乱的代码传递。

我在制作一个巨大的丑陋模块以方便地存储和传递所有这些问题(从常规代码中“隔离”需要此混乱的部分)时遇到了问题,而且我不知道如何声明这样的内容:

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)

(回购是我制作的包装Irmin函子的模块)。 显然这是行不通的,而且我尝试了太多语法,我猜这是不可能的,这意味着我做错了什么?

我希望以正确的方式提出建议,以一种干净的方式处理所有这些函子和类型,如何在不对函式和实例化Main模块中的所有内容的情况下进行传递,例如控制台或管道在之后传递它?

1 个答案:

答案 0 :(得分:4)

可能有这样的定义:

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)

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