O tipo união discriminada representa um número fixo de casos nomeados. Cada valor de uma união discriminada corresponde exatamente a um dos casos nomeados. Este tipo de dados é conhecido como tipo soma.
Cada caso de uma união discriminada pode ter, opcionalmente, dados associados, e casos diferentes podem ter diferentes tipos de dados. Se nenhum dos casos tiver dados associados, a união discriminada é semelhante ao que outras linguagens costumam designar por enumeração (ou enum).
Uma união discriminada é definida com a palavra-chave type e requer muito pouca sintaxe. Isto torna-as fáceis de usar, e vais encontrá-las em muitos sítios, incluindo na biblioteca base.
// 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
Podes criar um valor para um caso específico referindo o seu nome, ou o nome completo se o nome não for único. Como os nomes dos casos são apenas funções construtoras, os dados associados podem ser passados como um argumento normal de uma função.
let byName = Integer 2
let byFullName = Number.Invalid
As uniões discriminadas têm igualdade estrutural, o que significa que dois valores do mesmo caso e com os mesmos dados (opcionais) são equivalentes.
A forma preferida de trabalhar com uniões discriminadas é através da correspondência de padrões, usando o padrão de identificador:
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"