如何在 .mli 文件中包含模块?
how to include a module in a .mli file?
我可以在 mli 文件中包含库吗?
例如,假设我制作了以下 mli 文件
include Base
val bluh : int -> int
我收到一个未绑定的模块基础错误。
但是,如果我将文件更改为 .ml 文件,并将内容更改为
include Base
module type bluh1 = sig
val bluh : int -> int end
编译成功。所以 Base 库显然是 around,我只是出于某种原因不能在 .mli 文件中使用它。
谢谢!
I get an unbound module Base error.
这实际上不是您遇到的错误。编译器实际上是说,
Unbound module type Base
强调模块类型。
当您在 mli 文件中定义接口时,您定义的是类型和签名,而不是值和模块实现。所以你可以,但不要这样做,使用以下语法包含模块 Base 的签名,
include module type of Base (* a very bad idea, but works *)
但不要这样做。绝对没有理由将整个 Base 库(它很大)并将其所有实现和接口包含到您自己的模块中。为了使用库,您不需要在源代码中做任何事情,即,您不需要 include
或 open
或以其他方式要求或导入它。 OCaml 以及大多数编译语言中的库在工具链(也称为编译器)级别进行管理。因此,如果您需要一个库,您应该指示您的构建系统使用它 link(例如,将其添加到沙丘中的 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
模块是此类模块的一个示例,特别是因为它就像是对标准库的彻底改造。
我可以在 mli 文件中包含库吗?
例如,假设我制作了以下 mli 文件
include Base
val bluh : int -> int
我收到一个未绑定的模块基础错误。
但是,如果我将文件更改为 .ml 文件,并将内容更改为
include Base
module type bluh1 = sig
val bluh : int -> int end
编译成功。所以 Base 库显然是 around,我只是出于某种原因不能在 .mli 文件中使用它。
谢谢!
I get an unbound module Base error.
这实际上不是您遇到的错误。编译器实际上是说,
Unbound module type Base
强调模块类型。
当您在 mli 文件中定义接口时,您定义的是类型和签名,而不是值和模块实现。所以你可以,但不要这样做,使用以下语法包含模块 Base 的签名,
include module type of Base (* a very bad idea, but works *)
但不要这样做。绝对没有理由将整个 Base 库(它很大)并将其所有实现和接口包含到您自己的模块中。为了使用库,您不需要在源代码中做任何事情,即,您不需要 include
或 open
或以其他方式要求或导入它。 OCaml 以及大多数编译语言中的库在工具链(也称为编译器)级别进行管理。因此,如果您需要一个库,您应该指示您的构建系统使用它 link(例如,将其添加到沙丘中的 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
模块是此类模块的一个示例,特别是因为它就像是对标准库的彻底改造。