[英]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.