[英]What does the colon in this type definition mean?
当我找到术语equality witness
时,我正在阅读有关 higher-kinded-types 的文章,我查找了一个示例并找到了这个类型定义:
type ('a, 'b) eq = | Eq : ('a, 'a) eq
这里到底发生了什么? 我认为该类型与以下相同:
type ('a, 'b) eq = | Eq of ('a, 'a) eq
但是它们在顶层产生不同的外观输出。 那个冒号是怎么回事,那个类型是什么?
编辑:我有另一个假设,这意味着Eq
是类型('a, 'a) eq
但不知何故不是类型构造函数。 所以符号Eq
可以解释为('a, 'a) eq
。
这是声明GADT (用于广义代数数据类型)的语法,它们在此处全局引用: https://v2.ocaml.org/manual/gadts-tutorial.html 。 有时您可能希望使参数取决于构造函数和类型,GADT 允许这样做,例如:
type 'a t =
| String : string t
| Int : int t
String
的类型为string t
, Int
的类型为int t
t。GADT 有多种用途。 在您给出的示例中, Eq
唯一可能的构造意味着类型'a
与'b
相同。 因此,例如,我们显然可以定义该值: let _: (int, int) eq = Eq
而不是let _: (int, string) eq = Eq
。 这样看来,它似乎不是很有用,但也可以为语法上不同的类型提供类型相等性:
type my_alias_on_int = int
let _ : (alias_on_int, int) eq = Eq
将进行类型检查。 换句话说,实例化我们为其设置了两个类型参数的表达式Eq
意味着存在'a
与'b
具有相同类型的证据。 因此,例如,如果我定义了一个抽象类型,但提供了一个相等性见证(在 scope 中,我的类型相等性是已知的),我可以覆盖抽象以证明我的抽象类型是,在幕后,一个 integer:
module M : sig
type t
val eq : (t, int) eq
end = struct
type t = int
let eq = Eq
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.