提问人:Valentyn Zakharenko 提问时间:10/15/2023 更新时间:10/15/2023 访问量:48
在结构中声明私有类型的原因是什么?
What is the reason to declare private type in a struct?
问:
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 在结构体中有一个私有类型有什么用?
答:
4赞
octachron
10/15/2023
#1
出于同样的原因,您可以声明完全抽象的类型:例如,这些类型的值可以由外部函数创建
type t = private int
external f: unit -> t = "some_c_function"
此外,这使得类型定义更加规则,因为在签名和结构中始终允许使用相同的类型定义。
评论