A diszkriminált unió típus rögzített számú, elnevezett esetet képvisel. A diszkriminált unió minden értéke pontosan az egyik elnevezett esetnek felel meg. Az ilyen adattípust összegtípusnak nevezzük.
A diszkriminált unió minden esetéhez tartozhat opcionálisan adat, és a különböző esetekhez különböző típusú adat tartozhat. Ha egyik esethez sem tartozik adat, a diszkriminált unió ahhoz hasonlít, amit más nyelvek általában felsorolásnak (vagy enumnak) neveznek.
A diszkriminált uniót a type kulcsszóval definiáljuk, és nagyon kevés szintaxist igényel. Ez könnyen használhatóvá teszi őket, és sok helyen találkozhatsz velük, többek között az alapkönyvtárban is.
// 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
Egy adott esethez tartozó értéket úgy hozhatunk létre, hogy a nevére hivatkozunk, vagy a teljes nevére, ha a név nem egyedi. Mivel az esetnevek valójában konstruktorfüggvények, a hozzájuk tartozó adatot szokásos függvényargumentumként adhatjuk át.
let byName = Integer 2
let byFullName = Number.Invalid
A diszkriminált uniók strukturális egyenlőséggel rendelkeznek, ami azt jelenti, hogy két érték, amely ugyanahhoz az esethez tartozik és ugyanazzal az (opcionális) adattal rendelkezik, egyenértékű.
A diszkriminált uniókkal való munka javasolt módja a mintaillesztés, az azonosítóminta használatával:
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"