عيد الحب

عيد الحب

تمرين تعلّمي

مقدمة

الاتحادات المميزة

يمثل نوع الاتحاد المميز عددًا ثابتًا من الحالات المسماة. تقابل كل قيمة في اتحاد مميز حالة واحدة بالضبط من الحالات المسماة.

يُعرَّف الاتحاد المميز باستخدام الكلمة المفتاحية 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"

التعليمات

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • BoardGame: بلا بيانات مرتبطة.
  • Chill: بلا بيانات مرتبطة.
  • Movie: يحمل Genre الخاص به كبيانات مرتبطة.
  • Restaurant: يحمل Cuisine الخاص به كبيانات مرتبطة.
  • Walk: يحمل قيمة int تمثّل عدد الكيلومترات المطلوب المشي بها كبيانات مرتبطة.

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

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

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

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

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

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

سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.