عيد الحب

عيد الحب

تمرين تعلّمي

مقدمة

الأنواع المخصصة

تمثّل الأنواع المخصصة في 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"

التعليمات

في هذا التمرين، إنه عيد الحب، وأنت وشريكك تخططان للقيام بشيء لطيف معًا. لدى شريكك أفكار كثيرة، وهو يطلب منك الآن تقييم هذه الأفكار، من أجل الوصول إلى النشاط الذي ستمارسانه.

فيما يلي الأفكار التي يقترحها شريكك:

  • لعب لعبة لوحية
  • الاسترخاء
  • مشاهدة فيلم
  • الذهاب إلى مطعم

لديك ست مهام تساعدك على اختيار نشاط عيد الحب الخاص بك.

1. عرّف الموافقة

لكل فكرة يقترحها شريكك، تردّ بأحد ثلاثة خيارات: نعم، أو لا، أو ربما.

عرّف النوع المخصص Approval لتمثيل هذه الخيارات بالحالات الثلاث التالية: Yes وNo وMaybe.

2. عرّف المطابخ

اختار شريكك مطعمين محتملين: أحدهما يقدّم المطبخ الكوري والآخر يقدّم المطبخ التركي.

عرّف النوع المخصص Cuisine لتمثيل هذين المطبخين بالحالتين التاليتين: Korean وTurkish.

3. عرّف أنواع الأفلام

هناك أفلام كثيرة جدًا للاختيار من بينها، لذا ولتضييق الخيارات، يذكر شريكك أيضًا نوع الفيلم.

عرّف النوع المخصص Genre لتمثيل الأنواع التالية كحالات: Crime وHorror وRomance وThriller.

4. عرّف النشاط

كما قلنا، اقترح شريكك خمسة أنشطة مختلفة: لعب لعبة لوحية، والاسترخاء، ومشاهدة فيلم، والذهاب إلى مطعم.

عرّف النوع المخصص Activity لتمثيل أنواع الأنشطة هذه:

  • BoardGame: لا توجد بيانات مرتبطة.
  • Chill: لا توجد بيانات مرتبطة.
  • Movie: يحمل Genre الخاص به كبيانات مرتبطة.
  • Restaurant: يحمل Cuisine الخاص به كبيانات مرتبطة.

5. قيّم النشاط

أخيرًا، أنت جاهز لتقييم أفكار شريكك. هذا ما تشعر به تجاه فكرة شريكك:

  • لعب لعبة لوحية: لا.
  • الاسترخاء: لا.
  • مشاهدة فيلم: نعم إذا كان فيلمًا رومانسيًا؛ وإلا، فلا.
  • الذهاب إلى مطعم: نعم إذا كان المطبخ كوريًا، وربما إذا كان تركيًا.

نفّذ دالة باسم rateActivity تأخذ قيمة Activity وتُرجع Approval بناءً على المشاعر المذكورة أعلاه:

rateActivity (Restaurant Turkish)
-- => Maybe
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elm Exercism

مستعد لبدء عيد الحب؟

سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.