判別聯集型別代表固定數量的具名案例。判別聯集的每個值都恰好對應其中一個具名案例。這類資料型態稱為_和型別_。
判別聯集的每個案例可以選擇性地帶有關聯資料,而且不同的案例可以帶有不同型態的資料。如果所有案例都沒有關聯資料,這個判別聯集就類似其他語言通常所稱的_列舉_(或 enum)。
判別聯集使用type關鍵字定義,而且語法非常精簡。這讓它們易於使用,你會在很多地方看到它們,包括基底程式庫。
// Discriminated union without associated data
type Season =
| Spring
| Summer
| Autumn
| Winter
// Discriminated union with associated data
type Number =
| Integer of int
| Float of float
| Invalid
要為特定案例建立值,可以參照它的名稱;如果名稱不唯一,就使用完整名稱。由於案例名稱就是建構函式,關聯資料可以像一般的函式引數一樣傳入。
let byName = Integer 2
let byFullName = Number.Invalid
判別聯集具有_結構相等性_,意思是同一個案例、且帶有相同(選用)資料的兩個值會相等。
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"