डिस्क्रिमिनेटेड यूनियन टाइप नामित केसों की एक निश्चित संख्या को दर्शाता है। डिस्क्रिमिनेटेड यूनियन की हर वैल्यू इन नामित केसों में से ठीक एक से मेल खाती है।
डिस्क्रिमिनेटेड यूनियन को type कीवर्ड की मदद से परिभाषित किया जाता है, जिसमें केसों को पाइप (|) अक्षरों से अलग किया जाता है:
type Season =
| Spring
| Summer
| Autumn
| Winter
डिस्क्रिमिनेटेड यूनियन के हर केस के साथ डेटा जुड़ा हो सकता है, पर यह ज़रूरी नहीं है। अलग-अलग केसों के साथ अलग-अलग तरह का डेटा हो सकता है। अगर किसी केस के साथ कोई डेटा नहीं जुड़ा है, तो यह डिस्क्रिमिनेटेड यूनियन वैसा ही होता है जिसे दूसरी भाषाएँ सामान्यतः एन्यूमरेशन (या एनम) कहती हैं।
type Number =
| Integer of int
| Float of float
| Invalid
किसी खास केस की वैल्यू बनाने के लिए उसका नाम लिखा जाता है (जैसे Success). केसों के नाम तो कंस्ट्रक्टर फंक्शन ही होते हैं, इसलिए जुड़ा हुआ डेटा एक आम फंक्शन आर्गुमेंट की तरह दिया जा सकता है। अगर किसी दूसरे डिस्क्रिमिनेटेड यूनियन में इसी नाम का कोई केस पहले से बना है, तो आपको उसका पूरा नाम लिखना होगा (जैसे Result.Success).
let byName = Integer 2
let byFullName = Number.Invalid
डिस्क्रिमिनेटेड यूनियन में स्ट्रक्चरल इक्वालिटी होती है। इसका अर्थ है कि एक ही केस की दो वैल्यू, जिनके साथ एक जैसा (वैकल्पिक) डेटा जुड़ा हो, समान मानी जाती हैं।
डिस्क्रिमिनेटेड यूनियन के साथ काम करने के लिए if/elif/else एक्सप्रेशन भी इस्तेमाल किए जा सकते हैं, पर सुझाया गया तरीका यह है कि आइडेंटिफायर पैटर्न की मदद से पैटर्न मैचिंग की जाए:
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"
इस अभ्यास में वैलेंटाइन डे है, और आप और आपके साथी मिलकर कुछ अच्छा करने की योजना बना रहे हैं। आपके साथी के पास बहुत सारे विचार हैं, और अब वे आपसे इन विचारों को रेटिंग देने के लिए कह रहे हैं, ताकि तय हो सके कि कौन-सी गतिविधि की जाए।
आपके साथी ने ये विचार सुझाए हैं:
आपकी वैलेंटाइन डे की गतिविधि चुनने में मदद के लिए आपके सामने छह कार्य हैं।
आपके साथी जो भी विचार सुझाते हैं, उनमें से हर एक पर आप तीन में से एक जवाब देते हैं: हाँ, नहीं या शायद।
इन विकल्पों को इन तीन केसों के रूप में दर्शाने के लिए Approval डिस्क्रिमिनेटेड यूनियन बनाइए: Yes, No और Maybe।
आपके साथी ने दो संभावित रेस्टोरेंट चुने हैं: एक कोरियाई व्यंजनों पर आधारित और दूसरा तुर्की व्यंजनों पर।
इन व्यंजनों को इन दो केसों के रूप में दर्शाने के लिए Cuisine डिस्क्रिमिनेटेड यूनियन बनाइए: Korean और Turkish।
चुनने के लिए बहुत सारी फिल्में हैं, इसलिए विकल्प सीमित करने के लिए आपके साथी हर फिल्म की शैली भी बताते हैं।
इन शैलियों को केसों के रूप में दर्शाने के लिए Genre डिस्क्रिमिनेटेड यूनियन बनाइए: Crime, Horror, Romance और Thriller।
जैसा कहा गया, आपके साथी पाँच अलग-अलग गतिविधियाँ सुझा चुके हैं: बोर्ड गेम खेलना, आराम करना, फिल्म देखना, रेस्टोरेंट जाना और टहलने जाना।
इन गतिविधियों को दर्शाने के लिए Activity डिस्क्रिमिनेटेड यूनियन बनाइए:
BoardGame: कोई जुड़ा डेटा नहीं।Chill: कोई जुड़ा डेटा नहीं।Movie: इसका जुड़ा डेटा Genre है।Restaurant: इसका जुड़ा डेटा Cuisine है।Walk: इसका जुड़ा डेटा एक int है, जो चलने के किलोमीटर की संख्या दर्शाता है।अंत में, अब आप अपने साथी के विचारों को रेटिंग देने के लिए तैयार हैं। आपके साथी के विचारों पर आपकी राय यह है:
ऊपर बताई गई राय के आधार पर एक Activity वैल्यू लेने वाला और Approval लौटाने वाला rateActivity नाम का फंक्शन बनाइए:
rateActivity (Restaurant Turkish)
// => Maybe
Exercism पर साइन अप कीजिए और F# को 18 कॉन्सेप्ट148 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।