如何解决如何在 .mli 文件中包含模块?
我可以在 mli 文件中包含库吗?
例如,假设我制作了以下 mli 文件
include Base
val bluh : int -> int
我收到一个未绑定的模块基础错误。
但是,如果我将文件更改为 .ml 文件,并将内容更改为
include Base
module type bluh1 = sig
val bluh : int -> int end
它编译。所以 Base 库显然是周围,我只是因为某种原因不能在 .mli 文件中使用它。
谢谢!
解决方法
我收到一个未绑定的模块基础错误。
这实际上不是您遇到的错误。编译器实际上是在说,
Unbound module type Base
强调模块类型。
当您在 mli 文件中定义接口时,您定义的是类型和签名,而不是值和模块实现。所以你可以,但不要这样做,使用以下语法包含模块 Base 的签名,
include module type of Base (* a very bad idea,but works *)
但不要这样做。绝对没有理由将整个 Base 库(非常庞大)包含在您自己的模块中。为了使用库,您不需要在源代码中执行任何操作,即您不需要 include
或 open
或以其他方式要求或导入它。 OCaml 以及大多数编译语言中的库在工具链(又名编译器)级别进行管理。因此,如果您需要一个库,您应指示您的构建系统与其链接(例如,将其添加到沙丘中的 libraries
节或绿洲中的 BuildDepends
等)。
据我所知,你已经这样做了。现在,如果您想使用 Base
库的 base
模块中的函数(或模块或任何其他定义),只需在它前面加上 Base.
例如,>
let empty = Base.Map.empty (module Base.String)
如果您不想为每个名称添加前缀,则可以在模块的开头使用 open Base
,这将允许您引用 Base 中的任何定义而无需显式添加前缀,例如,
(* the recommended way *)
open Base
let empty = Map.empty (module String)
虽然一般不建议打开模块,但有些模块是设计为打开的,尽量不要用定义污染你的命名空间。 Base
模块就是此类模块的一个示例,特别是因为它的作用类似于标准库的大修。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。