2012-07-18 99 views
4

在頂層,我得到下面的輸出:`B是什麼意思?

#`B 
- : [> `B ] = `B 

那還有什麼`乙是什麼意思?我們爲什麼需要它?

真誠!

回答

6

`B這樣的反引號爲前綴的標識符是polymorphic variant類型的構造函數。它類似於一個代數類的構造函數:

type abc = A | B | C 

但是,您可以使用多態變形值沒有聲明,一般他們比一般的代數類型靈活得多。折中的是,他們使用起來也有點棘手。

有一件事人們使用它們作爲簡單命名的值,就像C或enum值,更準確地說,像Lisp中的原子。您可以使用普通的代數類型,但是您需要謹慎地維護它們的定義並防止重複。使用多態變體時,您不需要執行其中的任何一個。您可以在不聲明它們的情況下使用它們,並且構造函數不必是唯一的(兩種不同的類型可以具有相同的構造函數)。

多態性變異的構造也可以帶參數,如代數構造函數可以。因此,您也可以編寫(`B 77),這是一個帶有單個參數int的構造函數。

這是一個非常大的話題 - 看到OCaml的手冊上面鏈接部分獲取更多細節。

3

這是一個多態性變異。從documentation

1.4節中提供的變體是構建數據結構和算法的強大工具。但是,在模塊化編程中它們有時缺乏靈活性。這是因爲每個構造函數都保留一個與獨特類型一起使用的名稱。一個不能在另一個類型中使用相同的名稱,或者認爲某個類型的值屬於某個具有更多構造函數的其他類型。

隨着多態性變異,這種原始的假設被刪除。也就是說,變體標籤不屬於任何類型,類型系統將根據其使用情況檢查它是否爲允許值。在使用變體標籤之前,您無需定義類型。變體類型將針對其每個用途獨立推斷。