2011-11-22 32 views
11
type level = 
[ `Debug 
| `Info 
| `Warning 
| `Error] 

我可以在這裏刪除「`」嗎?有沒有反引號「`」有什麼區別?

真誠!

+0

這是相關的(有點):http://stackoverflow.com/questions/1746743/extending-an-existing-type-in​​-ocaml/1747400#1747400 –

回答

9

很難回答這個問題是或否。

您可以刪除反引號和方括號。然後,你將有

type level2 = Debug | Info | Warning | Error 

在最簡單的情況下,這種類型很相似,你level類型。它有4個常量構造函數。

但是,在更復雜的情況下,類型是完全不同的。您的類型levelpolymorphic variant類型,比上面的level2更靈活。的level的構造可以出現在任何數目的不同類型的在同一範圍內的,並且level參與了子類型關係:

# type level = [`Debug | `Info | `Warning | `Error] 
# type levelx = [`Debug | `Info | `Warning | `Error | `Fatal] 

# let isfatal (l: levelx) = l = `Fatal;; 
val isfatal : levelx -> bool = <fun> 
# let (x : level) = `Info;; 
val x : level = `Info 
# isfatal (x :> levelx);; 
- : bool = false 

這個例子的一點是,即使x具有鍵入level,可以作爲治療儘管它也是levelx型,因爲levellevelx的子類型。

level2這樣的非多態變體類型之間沒有子類型關係,事實上,在同一個作用域中,不能在多個這樣的類型中使用相同的構造函數名稱。

多態變體類型也可以是開放式的。這是一個很大的話題;如果你感興趣,你應該看到上面鏈接的OCaml手冊4.2節。

+1

afair,現在的可取名是「開放變種」 。 – ygrek