判別共用体型は、名前の付いた固定数のケースを表します。判別共用体の各値は、名前の付いたケースのうち必ず1つに対応します。この種のデータ型は、直和型 として知られています。
判別共用体の各ケースには、任意でデータを関連付けることができ、ケースごとに異なる型のデータを持たせられます。どのケースにもデータが関連付けられていない場合、判別共用体は、他の言語で一般に 列挙型(または 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
判別共用体は 構造的等価性 を持ちます。つまり、同じケースで同じ(任意の)データを持つ2つの値は等価です。
判別共用体を扱うのに好ましい方法は、識別子パターンを使ったパターンマッチングです。
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"