簡體   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