ocaml类型定义包含省略号

ocaml类型定义包含省略号,ocaml,ellipsis,Ocaml,Ellipsis,我正在阅读一些Ocaml项目的源代码,我是Ocaml新手。我对下面的代码感到困惑,这是一个.ml文件中的某种类型的定义 type event = Event.t = .. 代码中“…”的含义是什么?我搜索了手册,但什么也没找到。在event.mli中,类型定义为: type t = .. type event = t = .. 非常感谢您的帮助。这是一种可扩展的变体类型。它是一个变体,您可以在定义点以外的其他位置添加新案例。例如,您可以通过编写以下内容将自己添加到代码中的事件中: type

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

type event = Event.t = ..
代码中“…”的含义是什么?我搜索了手册,但什么也没找到。在event.mli中,类型定义为:

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

非常感谢您的帮助。

这是一种可扩展的变体类型。它是一个变体,您可以在定义点以外的其他位置添加新案例。例如,您可以通过编写以下内容将自己添加到代码中的
事件中:

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

可扩展变量类型自4.02以来一直是该语言的一部分,在中的手册中有描述

它是一种可扩展的变体类型。它是一个变体,您可以在定义点以外的其他位置添加新案例。例如,您可以通过编写以下内容将自己添加到代码中的
事件中:

type event += 
  | Mouse_move of int * int
  | Mouse_down of int * int
可扩展变量类型自4.02以来一直是该语言的一部分,在中的手册中有描述

它的新“可扩展变量类型”。有关详细信息,请参阅

可以使用声明空的可扩展变量类型

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是异常的广义版本

它的新“可扩展变量类型”。有关详细信息,请参阅

可以使用声明空的可扩展变量类型

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是异常的广义版本

它们是开放数据类型。看看@pdexter我不能打开这个链接,可能是因为我们国家的政策,我来自中国。它们是开放数据类型。看一看@pdexter我无法打开此链接,可能是因为我们国家的政策,我来自中国。谢谢,我在这方面还有一些问题。1、“可扩展变量类型”的含义是什么,即EVT通常用于什么情况;第二,当我测试
type event=t=…
时,utop会引发错误:解析错误:“private”或“{”或“|”或“=”(在[type\u kind]中)后预期的[constructor\u声明])对于1,我扩展了我的答案。对于2,我的猜测是utop的解析器不知道这种新语法。对于2,我测试了使用ocamlopt构建一个test.ml,其中包含EVT的双“=”定义,并且完全成功。对于1,你给了我一个很好的例子,这也意味着我应该在我想使用EVT构造函数,比如Error.Web.Http而不是Error.Http。再次感谢!utop似乎有自己的OCaml解析器,这有点过时了。(我不使用utop…谢谢,我在这方面还有一些问题。第一,拥有“可扩展变量类型”的含义是什么,即EVT通常用于什么情况;第二,当我测试
type event=t=…
时,utop会引发错误:解析错误:“private”或“{”或“|”或“=”(在[种类])对于1,我扩展了我的答案。对于2,我的猜测是utop的解析器不知道这种新语法。对于2,我测试了使用ocamlopt构建一个test.ml,其中包含EVT的双“=”定义,并且完全成功。对于1,你给了我一个很好的例子,这也意味着我应该在我想使用EVT构造函数,比如Error.Web.Http,而不是Error.Http。再次感谢!看起来utop有自己的OCaml解析器,有点过时了。(我不使用utop。。。