繁体   English   中英

这个类型定义中的冒号是什么意思?

[英]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 tInt的类型为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

本课程很好地概述了 GADT 的功能,本演示文稿也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM