簡體   English   中英

OCaml語法:什么類型'是什么意思?

[英]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.mla.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類型,你只能通過emptyadd和其他定義的函數來完成,但不能直接使用NilCons

由於OP具有C ++語言的經驗,我認為以下解釋可能有用。 表格的類型聲明:

type 'a t

接近C ++

template <typename a> class t;

例如, 'a list是通用列表, 'a是元素的類型。 為簡明起見,我們使用單個'而不是template <typename _>構造。 在OCaml的說法中,我們使用術語“參數多態”,而不是“泛型編程”。 而不是單詞模板,我們說一個類型構造函數。 后者有一個有趣的結果。 與在C ++中一樣,模板實例化創建類型的新實例,在OCaml中,協調多態類型的類型變量會創建新類型,例如, int listfloat list (cf, list<int>float<list> )。 因此,可以將類型構造函數'a list視為類型級別上的一元函數,它接受類型,並創建類型。 可以有nary類型構造函數,例如, type ('key, 'value) hashtbl是二進制類型構造函數,它為給定的keyvalue對創建一個類型。 此外,我們可以將非參數類型視為一個nullary類型構造函數,因此int構造int類型。

PS F#語言是OCaml的后代,允許以兩種形式編寫: int tt<int>

PPS為了防止可能的混淆,我想說,雖然模板和參數類型試圖解決相同的問題,但它們仍然沒有什么區別。 模板在實例化后輸入,之前是參數類型。 所以參數類型'at為所有 'a 'at定義'a 如果要創建一個類型變量未被普遍量化的類型,可以使用其他機制 - 仿函數。 它們也非常接近模板,但它們接受類型加類型要求,這是C ++用語中的概念。 這些概念在OCaml中的模塊類型中有所體現,因此仿函數實際上是模塊級別的函數,因為它接受模塊並生成模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM