- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以在 mli 文件中包含库吗?
例如,假设我制作了以下 mli 文件
include Base
val bluh : int -> int
我收到一个未绑定(bind)的模块 Base 错误。
但是,如果我将文件更改为 .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 文件中定义接口(interface)时,您定义的是类型和签名,而不是值和模块实现。所以你可以,但不要这样做,使用以下语法包含模块 Base 的签名,
include module type of Base (* a very bad idea, but works *)
但不要这样做。绝对没有理由将整个 Base 库(它很大)并将其所有实现和接口(interface)包含到您自己的模块中。为了使用一个库,你不需要在源代码中做任何事情,也就是说,你不需要include
或 open
或者 require 或 import它。 OCaml 以及大多数编译语言中的库在工具链(也称为编译器)级别进行管理。因此,如果您需要一个库,您应该指示您的构建系统与其链接(例如,将其添加到沙丘中的 libraries
节或绿洲中的 BuildDepends
等)。
据我所知,你已经做到了。现在,如果你想使用 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
模块就是此类模块的一个示例,特别是因为它就像是对标准库的彻底改造。
关于ocaml - 如何在 .mli 文件中包含模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68185943/
我是一名优秀的程序员,十分优秀!