可区分联合类型表示固定数量的命名情形。可区分联合的每个值都恰好对应其中一个命名情形。这类数据类型称为_和类型_。
可区分联合的每个情形都可以选择性地关联数据,而且不同情形可以关联不同类型的数据。如果所有情形都没有关联数据,那么可区分联合就类似于其他语言通常所说的_枚举_(或 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"