ocaml - 如何处理所有这些函子
问题描述
我来这里是为了别的事情,但试图写下我的问题,我意识到我做这件事是不可能的。我已经使用 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 模块中的所有内容进行函数化和实例化之后?
解决方案
这样的定义是可能的:
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)
(进行了一些无趣的更改来进行代码类型检查。)
推荐阅读
- vb.net - VB.net Dictionary - 从字典中获取所有值等于 1
- stm32 - 如何使用 DFU 启动 STM32F405RGT6
- c# - 当有人在 Microsoft Teams 中卸载你的应用时会触发哪个事件
- c# - asp net core路由多个参数
- stored-procedures - 在雪花中如何获取我想要的日期雪花格式
- amazon-web-services - 使空资源等待 Terraform 中的 aws_route53_record
- calendar - 未在电子邮件中显示 RSVP 按钮 - ical-generator
- java - 如何获得 Java 代码覆盖率的全面覆盖?Junit 测试用例
- python - 我的 pygame 播放器精灵没有移动和/或更新
- html - 按类别过滤的复选框效果不佳