يمثل نوع الاتحاد المميز عددًا ثابتًا من الحالات المسماة. تقابل كل قيمة في اتحاد مميز حالة واحدة بالضبط من الحالات المسماة.
يُعرَّف الاتحاد المميز باستخدام الكلمة المفتاحية type، مع فصل الحالات بمحارف الأنبوب (|):
type Season =
| Spring
| Summer
| Autumn
| Winter
يمكن أن تحتوي كل حالة في اتحاد مميز، اختياريًا، على بيانات مرتبطة بها، ويمكن أن تحتوي حالات مختلفة على أنواع مختلفة من البيانات. إذا لم تكن لأي من الحالات بيانات مرتبطة بها، يكون الاتحاد المميز مشابهًا لما تشير إليه اللغات الأخرى عادةً باسم تعداد (أو enum).
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 تمثّل عدد الكيلومترات المطلوب المشي بها كبيانات مرتبطة.أخيرًا، أصبحت جاهزًا لتقييم أفكار شريكك. وهذا شعورك تجاه كل فكرة من أفكار شريكك:
نفّذ دالة باسم rateActivity تأخذ قيمة Activity وتُرجع Approval بناءً على المشاعر أعلاه:
rateActivity (Restaurant Turkish)
// => Maybe
سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.