[英]OCaml syntax: what does type 'a t mean?
這是關於OCaml中的類型定義,我發現以下語法令人費解:
type 'a t
簡單的英語是什么意思?
這是一個參數類型聲明。
類型聲明允許您聲明一個新的數據類型:
type my_type = int * string
let x : my_type = (42,"Sorry for the inconvenience")
但有時,您希望類型是參數化的,這意味着它需要另一種類型作為參數:
type 'a container = 'a * string * 'a
let x : int container = (0, "hello", 1)
let y : string container = ("stack", "over", "flow")
現在,在這種情況下,你的類型聲明后就沒有了。 其含義取決於它是否在模塊的structure
(例如,在.ml
文件之上)或signature
(例如在.mli
)
如果它在一個結構中,它聲明一個內部沒有值的類型。 哪個像空集一樣有用(有時它是,但不多)。 但是,如果它在簽名中,則表示“某處存在參數化定義,但從此處不可見”。
假設有兩個文件a.ml
和a.mli
:
(* a.ml *)
type 'a t = Nil | Cons of 'a * 'a t
let empty = Nil
let add x l = Cons (x,l)
(* and so on... *)
(* a.mli *)
type 'a t
val empty : 'a t
val add : 'a -> 'a t -> 'at
(* and so on... *)
如果在程序的其余部分中你想要操作At
類型,你只能通過empty
和add
和其他定義的函數來完成,但不能直接使用Nil
和Cons
。
由於OP具有C ++語言的經驗,我認為以下解釋可能有用。 表格的類型聲明:
type 'a t
接近C ++
template <typename a> class t;
例如, 'a list
是通用列表, 'a
是元素的類型。 為簡明起見,我們使用單個'
而不是template <typename _>
構造。 在OCaml的說法中,我們使用術語“參數多態”,而不是“泛型編程”。 而不是單詞模板,我們說一個類型構造函數。 后者有一個有趣的結果。 與在C ++中一樣,模板實例化創建類型的新實例,在OCaml中,協調多態類型的類型變量會創建新類型,例如, int list
, float list
(cf, list<int>
, float<list>
)。 因此,可以將類型構造函數'a list
視為類型級別上的一元函數,它接受類型,並創建類型。 可以有nary類型構造函數,例如, type ('key, 'value) hashtbl
是二進制類型構造函數,它為給定的key
和value
對創建一個類型。 此外,我們可以將非參數類型視為一個nullary類型構造函數,因此int
構造int
類型。
PS F#語言是OCaml的后代,允許以兩種形式編寫: int t
和t<int>
PPS為了防止可能的混淆,我想說,雖然模板和參數類型試圖解決相同的問題,但它們仍然沒有什么區別。 模板在實例化后輸入,之前是參數類型。 所以參數類型'at
是為所有 'a
'at
定義'a
。 如果要創建一個類型變量未被普遍量化的類型,可以使用其他機制 - 仿函數。 它們也非常接近模板,但它們接受類型加類型要求,這是C ++用語中的概念。 這些概念在OCaml中的模塊類型中有所體現,因此仿函數實際上是模塊級別的函數,因為它接受模塊並生成模塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.