我在这里只是想写些其他问题,但我试图写出我的问题,我意识到我无法做到这一点。 我使用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模块中的所有内容的情况下进行传递,例如控制台或管道在之后传递它?
答案 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)
(进行了一些有趣的更改以检查代码类型。)