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