डिस्क्रिमिनेटेड यूनियन टाइप नामित केसों की एक निश्चित संख्या को दर्शाता है। डिस्क्रिमिनेटेड यूनियन की प्रत्येक वैल्यू इन नामित केसों में से ठीक एक से मेल खाती है। इस तरह के डेटा टाइप को सम टाइप कहा जाता है।
डिस्क्रिमिनेटेड यूनियन के प्रत्येक केस के साथ वैकल्पिक रूप से डेटा जुड़ा हो सकता है, और अलग-अलग केसों के साथ अलग-अलग टाइप का डेटा जुड़ा हो सकता है। यदि किसी भी केस के साथ डेटा नहीं जुड़ा है, तो डिस्क्रिमिनेटेड यूनियन वैसा ही होता है जिसे अन्य भाषाएँ आमतौर पर इन्यूमरेशन (या इन्यूम) कहती हैं।
डिस्क्रिमिनेटेड यूनियन को 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"