تمثّل الأنواع المخصصة في Elm عددًا ثابتًا من الحالات المسماة. وكل قيمة تناظر حالة واحدة بالضبط من هذه الحالات المسماة.
يُعرَّف النوع المخصص باستخدام الكلمة المفتاحية type، ولا يتطلب إلا القليل جدًا من الصياغة. وهو من أهم التقنيات في برمجة Elm، ويُستخدم لجعل القيم الممكنة في الكود تطابق تمامًا القيم الصحيحة في الواقع، فلا يترك مجالًا لبيانات غير صحيحة، ويجعل تمثيل الحالات المستحيلة في الكود مستحيلًا.
type Season
= Spring
| Summer
| Autumn
| Winter
يمكن لكل حالة من حالات النوع المخصص أن تحمل بيانات مرتبطة بها اختياريًا، ويمكن أن تحمل الحالات المختلفة أنواعًا مختلفة من البيانات. وإذا لم تكن لأي من الحالات بيانات مرتبطة بها، فإن الاتحاد المميز يشبه ما تشير إليه اللغات الأخرى عادةً باسم التعداد (أو enum).
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
يمكن إنشاء قيمة لحالة معيّنة بالإشارة إلى اسمها (Spring) حين تكون هذه الحالة معرّفة في الوحدة نفسها، أو مستوردة بصيغة import SeasonModule exposing (Season(..))، أو بالإشارة إلى اسمها المؤهَّل بالكامل (Season.Spring) عند استيرادها بصيغة import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
الأنواع المخصصة، شأنها شأن كل شيء في Elm، لديها المساواة البنيوية، وهذا يعني أن قيمتين تنتميان إلى الحالة نفسها وتحملان البيانات (الاختيارية) نفسها تكونان متكافئتين.
والأسلوب المفضّل للتعامل مع الأنواع المخصصة هو مطابقة الأنماط:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
في هذا التمرين، إنه عيد الحب، وأنت وشريكك تخططان للقيام بشيء لطيف معًا. لدى شريكك أفكار كثيرة، وهو يطلب منك الآن تقييم هذه الأفكار، من أجل الوصول إلى النشاط الذي ستمارسانه.
فيما يلي الأفكار التي يقترحها شريكك:
لديك ست مهام تساعدك على اختيار نشاط عيد الحب الخاص بك.
لكل فكرة يقترحها شريكك، تردّ بأحد ثلاثة خيارات: نعم، أو لا، أو ربما.
عرّف النوع المخصص Approval لتمثيل هذه الخيارات بالحالات الثلاث التالية: Yes وNo وMaybe.
اختار شريكك مطعمين محتملين: أحدهما يقدّم المطبخ الكوري والآخر يقدّم المطبخ التركي.
عرّف النوع المخصص Cuisine لتمثيل هذين المطبخين بالحالتين التاليتين: Korean وTurkish.
هناك أفلام كثيرة جدًا للاختيار من بينها، لذا ولتضييق الخيارات، يذكر شريكك أيضًا نوع الفيلم.
عرّف النوع المخصص Genre لتمثيل الأنواع التالية كحالات: Crime وHorror وRomance وThriller.
كما قلنا، اقترح شريكك خمسة أنشطة مختلفة: لعب لعبة لوحية، والاسترخاء، ومشاهدة فيلم، والذهاب إلى مطعم.
عرّف النوع المخصص Activity لتمثيل أنواع الأنشطة هذه:
BoardGame: لا توجد بيانات مرتبطة.Chill: لا توجد بيانات مرتبطة.Movie: يحمل Genre الخاص به كبيانات مرتبطة.Restaurant: يحمل Cuisine الخاص به كبيانات مرتبطة.أخيرًا، أنت جاهز لتقييم أفكار شريكك. هذا ما تشعر به تجاه فكرة شريكك:
نفّذ دالة باسم rateActivity تأخذ قيمة Activity وتُرجع Approval بناءً على المشاعر المذكورة أعلاه:
rateActivity (Restaurant Turkish)
-- => Maybe
سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.