如何避免在 Ocaml 中隐藏 stdlib 模块?

How do I avoid shadowing an stdlib module in Ocaml?

我有一个程序使用 Ocaml 标准库中的 Bytes 模块,并在文件顶部打开 Core_kernel.Std 模块

open Core_kernel.Std

...

   let let buf = Bytes.make bom_len '\x00' in

我遇到的问题是 Core_kernel 的最新版本引入了一个新的 Bytes 模块,它隐藏了标准库中的模块,这导致 Unbound value Bytes.make 编译错误。

有没有办法在不去掉文件顶部的 open 的情况下解决这个命名问题?如果我这样做,将需要更改很多东西。

您可以为 Bytes 模块提供替代名称,例如:

module B = Bytes

open Core_kernel.Std

let buf = B.make 10 '\x00'

然后在您的代码中执行搜索替换,将 Bytes 更改为 B

另一种解决方案是避免使用 open,但我想这需要对代码进行大量更改。

Core_kernel 提供 Caml 模块绑定标准库中可用的所有内容。

所以,你可以这样写

open Core_kernel.Std

...

   let buf = Caml.Bytes.make bom_len '\x00' in

不幸的是,Caml.Bytes 仅在 113.00.00 版本中 added,OPAM 还没有。