正如其他人已經指出,在技術上,StringConstant
是隻是一個單一的情況下,可識別聯合,您可以使用模式匹配提取價值。
在F#中談到domain modelling時,我喜歡用另一個有用的比喻。通常情況下,你可以說一些數據類型是一個元組開始:
type Person = string * int
這是爲了表示數據非常簡單的方法,但問題是,當你寫"Tomas", 42
,編譯器不知道你的意思Person
,而是將其理解爲string * int
元組。一情況下,可識別聯合是一個非常好的方式來名你的元組:
type Person = Person of string * int
這可能是一個有點混亂,這是使用該名稱Person
兩次 - 第一次作爲一個類型名稱,第二爲的名稱案子。這沒有什麼特別的含義 - 它只是意味着這個類型的名稱與案例相同。
現在您可以編寫Person("Tomas", 42)
來創建一個值,它將有一個類型Person
。您可以使用match
或let
對其進行分解,但您也可以輕鬆編寫採用Person
的函數。例如,返回的名字,你可以這樣寫:
let getName (Person(name, _)) =
name
我覺得單的情況下識別聯合是經常使用,主要是因爲他們真的很容易界定,真的很容易的工作。但是,我不會在作爲公共API公開的代碼中使用它們,因爲它們有點不尋常,可能會令人困惑。
PS:另外請注意,你需要提取值時使用括號:
// Correct. Defines symbols 'name' and 'age'
let (Person(name, age)) = tomas
// Incorrect! Defines a function `Person` that takes a tuple
// (and hides the `Person` case of the discriminated union)
let Person(name, age) = tomas
+1(我不得不刪除我的正在進行的答案的第一段,因爲它正是你寫的:-)) –