Ο τύπος διακριτής ένωσης αντιπροσωπεύει έναν σταθερό αριθμό ονομασμένων περιπτώσεων. Κάθε τιμή μιας διακριτής ένωσης αντιστοιχεί σε ακριβώς μία από τις ονομασμένες περιπτώσεις. Αυτός ο τύπος δεδομένων είναι γνωστός ως τύπος αθροίσματος.
Κάθε περίπτωση μιας διακριτής ένωσης μπορεί προαιρετικά να έχει δεδομένα συσχετισμένα μαζί της, και διαφορετικές περιπτώσεις μπορούν να έχουν διαφορετικούς τύπους δεδομένων. Αν καμία από τις περιπτώσεις δεν έχει συσχετισμένα δεδομένα, η διακριτή ένωση μοιάζει με αυτό που σε άλλες γλώσσες συνήθως αποκαλείται απαρίθμηση (ή 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"