ocaml 类型定义包含省略号

ocaml type definition contains ellipsis

我正在阅读一些 Ocaml 项目的源代码,我是新手Ocaml.I我对以下代码感到困惑,这是 .ml 文件中的某种类型定义。

type event = Event.t = ..

代码中'..'是什么意思,查了手册也没找到。在 event.mli 中,类型定义是:

type t = ..
type event = t = ..

感谢任何帮助,谢谢。

它是一个可扩展的变体类型。这是一个变体,您可以在定义点以外的其他地方添加新案例。例如,您可以在自己的代码中添加此 event,方法是:

type event += 
  | Mouse_move of int * int
  | Mouse_down of int * int

自 4.02 以来,可扩展变体类型是语言的一部分,并在 this section 中的手册中进行了描述。

它是新的 "extensible variant types"。有关详细信息,请参阅 http://caml.inria.fr/pub/docs/manual-ocaml/extn.html#sec251

您可以使用

声明一个空的可扩展变体类型
type t = ..

然后您可以添加新的构造函数,例如

type t += Foo | Bar of int

您可以在程序的多个位置向可扩展变体添加构造函数。相反,您无法在模式匹配时享受非穷举检查,这适用于普通变体。

type event = t = .. 声明已存在的可扩展类型 t 的别名 event= .. 需要使新类型也可扩展。

type event = t = ..
type event += Poo  (* you cannot do this if type event = t *)

备注

可扩展变体类型可能在以下情况下有用:

  • 您不想修复构造函数集。
  • 您觉得构造函数彼此之间的关系相当松散,认为在一个地方声明它们没有任何好处。

例如,应用程序的各种错误类型很适合定义为 EVT:应用程序可能由于网络问题、身份验证失败、磁盘已满等原因而失败。它们彼此无关,来自应用程序的许多部分。在这种情况下,您可能希望将类型 error 定义为 EVT:

(* module Error *)
type t = ..

(* module Web *)
type Error.t += Http of int (* ex. 404 *)

(* module Tempfile *)
type Error.t += Diskfull of Path.t

(* module ErrorHandler *)
let print_error (e : Error.t) = match e with
  | Web.HTTP stat -> ...
  | Tempfile.Diskfull path -> ...
  | ...

您可能会注意到它看起来像异常,实际上 EVT 是异常的通用版本。