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 是异常的通用版本。
我正在阅读一些 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 是异常的通用版本。