مسیرها
/
Elm
Elm
/
تمرین‌ها
/
روز ولنتاین
روز ولنتاین

روز ولنتاین

تمرین یادگیری

مقدمه

نوع سفارشی

نوع سفارشی در Elm از تعداد ثابتی از حالتهای نامدار تشکیل شده است. هر مقدار دقیقاً با یکی از حالتهای نامدار متناظر است.

نوع سفارشی با کلیدواژه‌ی type تعریف می‌شود و نحوه‌ی نگارش مورد نیازش بسیار اندک است. این نوعها یکی از مهم‌ترین تکنیک‌های برنامه‌نویسی در Elm هستند و برای این به کار می‌روند که مقادیر ممکن در کد دقیقاً با مقادیر معتبر در دنیای واقعی مطابقت داشته باشند، که هیچ جایی برای داده‌ی نامعتبر باقی نمی‌گذارد و حالت‌های ناممکن را در کد غیرقابل نمایش می‌کند.

type Season
    = Spring
    | Summer
    | Autumn
    | Winter

هر حالت از یک نوع سفارشی می‌تواند به‌صورت اختیاری داده‌ای متناظر با خود داشته باشد و حالت‌های مختلف می‌توانند انواع داده‌ی متفاوتی داشته باشند. اگر هیچ‌یک از حالت‌ها داده‌ای نداشته باشند، اجتماع تفکیک‌شده مشابه چیزی است که سایر زبان‌ها معمولاً از آن به‌عنوان enumeration (یا 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.

نوع سفارشی Approval را طوری تعریف کنید که این گزینه‌ها را به‌صورت سه حالت زیر نمایش دهد: Yes، No و Maybe.

2. تعریف Cuisine

شریک شما دو رستوران ممکن را انتخاب کرده است: یکی با آشپزی کره‌ای و دیگری با آشپزی ترکی.

نوع سفارشی Cuisine را طوری تعریف کنید که این آشپزی‌ها را به‌صورت دو حالت زیر نمایش دهد: Korean و Turkish.

3. تعریف Genre

فیلم‌های بی‌شماری برای انتخاب وجود دارد، پس شریک شما برای اینکه انتخاب را محدودتر کند، ژانر آن‌ها را هم فهرست می‌کند.

نوع سفارشی Genre را تعریف کنید تا ژانرهای زیر را به‌صورت حالت نمایش دهد: Crime، Horror، Romance و Thriller.

4. تعریف Activity

همان‌طور که گفته شد، شریک شما پنج فعالیت مختلف به ذهنش رسیده است: بازی رومیزی بازی کردن، استراحت کردن، تماشای فیلم و رفتن به رستوران.

نوع سفارشی Activity را تعریف کنید تا این انواع فعالیت را نمایش دهد:

  • BoardGame: بدون داده‌ی همراه.
  • Chill: بدون داده‌ی همراه.
  • Movie: دارای Genre به‌عنوان داده‌ی همراه.
  • Restaurant: دارای Cuisine به‌عنوان داده‌ی همراه.

5. امتیازدهی به Activity

در نهایت، آماده‌اید که به ایده‌های شریکتان امتیاز بدهید. نظر شما درباره‌ی ایده‌ی شریکتان این است:

  • بازی رومیزی بازی کردن: no.
  • استراحت کردن: no.
  • تماشای فیلم: اگر فیلم عاشقانه باشد yes؛ در غیر این صورت no.
  • رفتن به رستوران: اگر آشپزی کره‌ای باشد yes، اگر ترکی باشد maybe.

تابعی به اسم rateActivity پیاده‌سازی کنید که یک مقدار Activity می‌گیرد و بر اساس احساسات بالا Approval را برمی‌گرداند:

rateActivity (Restaurant Turkish)
-- => Maybe
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elm Exercism

آماده‌اید روز ولنتاین را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elm را همراه با 28 مفهوم110 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.