如何避免在 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 还没有。
我有一个程序使用 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 还没有。