OCaml 模块中的私有值?

Private values in OCaml module?

是否可以有一个 let 绑定(无论是函数、值等)对其模块 private 并且从外部不可见?

假设我们有 A.ml:

let exported = 1
let local = 2

我只希望 exported 可以从其他模块访问。 B.ml:

let a = A.exported
let error = A.local (* This should error *)

类似于 let%privateReason 中的作用。

这就是签名和 mli 文件背后的动机:它们允许向外部世界隐藏信息并仅公开 API 的相关部分,而不公开实施细节。在你的情况下,它看起来像

(* A.ml *)
let exported = 1
let local = 2

(* A.mli *)
val exported: int

那么只有 exportedA.ml 之外可见。

是的,这就是 module signatures and on the file level the .mli file 的目的。

简单说明一下,加一个A.mli,然后把你要导出的定义放进去:

val exported : int

这不是惯用语,但为了完整起见:

4.08 以来,当 open 被扩展为接受任意模块表达式时,可以在不使用模块签名的情况下创建私有绑定:

open struct
  let local = 2
end

在此之前,您必须为模块命名然后打开它,这将公开模块及其内容,尽管当然可以为它指定一个表明不应使用它的名称。

module Internal = struct
  let local = 2
end

open Internal