在结构中声明私有类型的原因是什么?

What is the reason to declare private type in a struct?

提问人:Valentyn Zakharenko 提问时间:10/15/2023 更新时间:10/15/2023 访问量:48

问:

OCaml 允许在签名中将类型标记为私有。这是有道理的。声明为 private 类型的对象只能在模块内部创建,并在模块外部读取。

module X : sig
  type t = private { value : int }
  val make : int -> t 
end = struct
  type t = { value : int }
  let make x = { value = x }
end

let x = X.make 3        (* OK *)
let value = x.value     (* OK *)
let x = X.{ value = 3 } (* ERROR *)

很明显。但 OCaml 还提供了在模块结构中声明私有类型的功能。

module X : sig
  type t = private { value : int }
  val make : int -> t 
end = struct
  type t = private { value : int }
  let make x = { value = x } (* ERROR *)
end

错误:无法创建私有类型 t 的值

它看起来像一个愚蠢的功能,因为当不可能创建它的任何对象时,没有人需要它。

对我来说,当 private 是仅在签名级别(如抽象类型)中允许的属性时,看起来更合乎逻辑。

OCaml 在结构体中有一个私有类型有什么用?

模块 OCAML 结构 封装 签名

评论


答:

4赞 octachron 10/15/2023 #1

出于同样的原因,您可以声明完全抽象的类型:例如,这些类型的值可以由外部函数创建

type t = private int
external f: unit -> t = "some_c_function"

此外,这使得类型定义更加规则,因为在签名和结构中始终允许使用相同的类型定义。