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