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

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

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

Вступ

Власні типи

Власні типи дають змогу визначати в Gleam нові типи даних. Вони можуть мати кілька варіантів, кожен зі своєю назвою.

pub type Season {
  Spring
  Summer
  Autumn
  Winter
}

Кожен варіант власного типу може за бажанням містити деякі дані, і різні варіанти можуть мати різні типи даних. Коли варіант містить дані, його називають записом.

pub type Number {
  SomeInt(Int)
  SomeFloat(Float)
  Invalid
}

Створити значення для конкретного варіанта можна, звернувшись до його назви, якщо він не містить додаткових даних (Spring), або викликавши його як функцію, якщо містить (SomeInt(2)).

let spring = Spring
let integerTwo = SomeInt(2)

Власні типи, як і все в Gleam, мають структурну рівність, тобто два значення одного варіанта з однаковими даними є еквівалентними.

Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False

Варіанти власних типів можна зіставляти зі зразками за допомогою виразів case.

import gleam/int
import gleam/float

pub fn describe(flexible_number: Number) -> String {
  case flexible_number {
    SomeFloat(f) -> "Float: " <> float.to_string(f)
    SomeInt(i) -> "Int: " <> int.to_string(i)
    Invalid -> "Neither a float nor an int"
  }
}

Вказівки

У цій вправі День святого Валентина, і ми з партнером плануємо зробити щось приємне разом. У партнера багато ідей, і тепер партнер просить нас оцінити їх, щоб вибрати, чим зайнятися.

Ось ідеї, які пропонує партнер:

  • Гра в настільну гру
  • Розслабитися
  • Подивитися фільм
  • Сходити до ресторану
  • Піти на прогулянку

На нас чекає шість завдань, які допоможуть вибрати заняття на День святого Валентина.

1. Визначте схвалення

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

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

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

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

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

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

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

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