Треки
/
Elm
Elm
/
Вправи
/
День Валентина
День Валентина

День Валентина

Навчальна вправа

Вступ

Власні типи

Власні типи в 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. Визначте схвалення

На кожну ідею, яку пропонує партнер, ми відповідаємо одним із трьох варіантів: yes, no або maybe.

Визначте власний тип Approval, щоб представити ці варіанти такими трьома випадками: Yes, No та Maybe.

2. Визначте кухні

Партнер обрав два можливі ресторани: один із кухнею Korean, а інший із кухнею Turkish.

Визначте власний тип Cuisine, щоб представити ці кухні такими двома випадками: Korean та Turkish.

3. Визначте жанри фільмів

Фільмів на вибір безліч, тож, щоб звузити коло, партнер також наводить їхній жанр.

Визначте власний тип Genre, щоб представити такі жанри випадками: Crime, Horror, Romance та Thriller.

4. Визначте заняття

Як уже сказано, партнер придумав пʼять різних занять: гра в настільну гру, розслабитися, подивитися фільм і піти до ресторану.

Визначте власний тип Activity, щоб представити ці типи занять:

  • BoardGame: без повʼязаних даних.
  • Chill: без повʼязаних даних.
  • Movie: має Genre як повʼязані дані.
  • Restaurant: має Cuisine як повʼязані дані.

5. Оцініть заняття

Нарешті ми готові оцінити ідеї партнера. Ось як ми ставимося до ідей партнера:

  • Гра в настільну гру: no.
  • Розслабитися: no.
  • Подивитися фільм: yes, якщо це романтичний фільм; інакше no.
  • Піти до ресторану: yes, якщо кухня Korean, maybe, якщо Turkish.

Реалізуйте функцію з назвою rateActivity, яка приймає значення типу Activity і повертає Approval на основі наведених вище уподобань:

rateActivity (Restaurant Turkish)
-- => Maybe
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elm Exercism

Час розпочати День Валентина?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.