نوع اتحاد تفکیکشده نمایندهی تعداد ثابتی از حالتهای نامدار است. هر مقدار از یک اتحاد تفکیکشده دقیقاً با یکی از حالتهای نامدار متناظر است. به این نوع از انواع داده، «نوع مجموع» میگویند.
هر حالت از یک اتحاد تفکیکشده میتواند بهصورت اختیاری دادهای همراه داشته باشد، و حالتهای مختلف میتوانند انواع مختلفی از داده داشته باشند. اگر هیچکدام از حالتها دادهای همراه نداشته باشند، اتحاد تفکیکشده شبیه چیزی است که در زبانهای دیگر معمولاً «برشماری» (یا «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"