Власні типи дають змогу визначати в 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"
}
}
У цій вправі День святого Валентина, і ми з партнером плануємо зробити щось приємне разом. У партнера багато ідей, і тепер партнер просить нас оцінити їх, щоб вибрати, чим зайнятися.
Ось ідеї, які пропонує партнер:
На нас чекає шість завдань, які допоможуть вибрати заняття на День святого Валентина.
На кожну ідею, яку пропонує партнер, ми відповідаємо однією з трьох опцій: yes, no або maybe.
Визначте власний тип Approval, щоб представити ці опції такими трьома варіантами: Yes, No і Maybe.
Партнер обрав два можливі ресторани: один з корейською кухнею, а інший з турецькою.
Визначте власний тип Cuisine, щоб представити ці кухні такими двома варіантами: Korean і Turkish.
Фільмів на вибір безліч, тож щоб звузити коло, партнер також перелічує їхні жанри.
Визначте власний тип Genre, щоб представити такі жанри варіантами: Crime, Horror, Romance і Thriller.
Як уже згадувалося, партнер вигадав пʼять різних занять: гра в настільну гру, розслабитися, подивитися фільм, сходити до ресторану та піти на прогулянку.
Визначте власний тип Activity, щоб представити ці типи занять:
BoardGame: без повʼязаних даних.Chill: без повʼязаних даних.Movie: має свій Genre як повʼязані дані.Restaurant: має свою Cuisine як повʼязані дані.Walk: має Int, що представляє кількість кілометрів для прогулянки, як повʼязані дані.Нарешті ми готові оцінити ідеї партнера. Ось як ми ставимося до ідей партнера:
Реалізуйте функцію з назвою rate_activity, яка приймає значення Activity і повертає Approval на основі наведених вище уподобань:
rate_activity(Restaurant(Turkish))
// -> Maybe
Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.