عيد الحب

عيد الحب

تمرين تعلّمي

مقدمة

يمثل نوع البيانات الجبري (ADT) عددًا ثابتًا من الحالات المسماة. وكل قيمة من قيم نوع البيانات الجبري تقابل حالة واحدة بالضبط من الحالات المسماة.

يُعرّف نوع البيانات الجبري باستخدام الكلمة المفتاحية data، مع فصل الحالات بمحرف الأنبوب (|). إذا لم تكن مرتبطة بأي من الحالات بيانات، فإن نوع البيانات الجبري يشبه ما تسميه اللغات الأخرى عادةً تعدادًا (أو enum).

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

يمكن أن تكون هناك بيانات مرتبطة بكل حالة من حالات نوع البيانات الجبري، ويمكن أن يكون للحالات المختلفة أنواع مختلفة من البيانات. وعندما ترتبط بالحالة بيانات، يلزم وجود باني.

data Number
  = NInt Int      --'NInt' is the constructor for an Int Number.
  | NFloat Float  --'NFloat' is the constructor for an Float Number.
  | Invalid       --'Invalid' does not have data associated to it.

يمكن إنشاء قيمة لحالة معينة بالإشارة إلى اسمها (مثل NInt 22). ولأن أسماء الحالات هي مجرد دوال بانية، يمكن تمرير البيانات المرتبطة كوسيط دالة عادي.

تتمتع أنواع البيانات الجبرية بالتساوي البنيوي، مما يعني أن قيمتين لنفس الحالة وبنفس البيانات (الاختيارية) متكافئتان.

بينما يمكن استخدام تعبيرات if/else للتعامل مع أنواع البيانات الجبرية، فإن الأسلوب الموصى به للتعامل معها هو مطابقة الأنماط باستخدام عبارة case:

add1 :: Number -> String
add1 number =
    case number of
      NInt    i -> show (i + 1)
      NFloat  f -> show (f + 1.0)
      Invalid   -> error "Invalid input"

التعليمات

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

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

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

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

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 يفتح الرابط في نافذة أو علامة تبويب جديدة
Haskell Exercism

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

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