gpt4 book ai didi

ocaml - 如何在 .mli 文件中包含模块?

转载 作者:行者123 更新时间:2023-12-05 02:41:13 25 4
gpt4 key购买 nike

我可以在 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)包含到您自己的模块中。为了使用一个库,你不需要在源代码中做任何事情,也就是说,你不需要includeopen 或者 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com