يمثّل نوع الاتحاد المميّز عددًا ثابتًا من الحالات المسمّاة. وتقابل كل قيمة من قيم الاتحاد المميّز حالة واحدة بالضبط من الحالات المسمّاة. ويُعرف هذا النوع من أنواع البيانات باسم النوع المجموعي.
ويمكن أن ترتبط بكل حالة من حالات الاتحاد المميّز بيانات اختيارية، ويمكن أن تختلف أنواع البيانات بين الحالات المختلفة. وإذا لم ترتبط أي بيانات بأي من الحالات، فإن الاتحاد المميّز يشبه ما تُسمّيه لغات البرمجة الأخرى عادةً التعداد (أو 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"