У мові Elm для необовʼязкових значень є тип Maybe.
Тому він присутній у сигнатурах типів багатьох основних функцій Elm, і розуміти його вкрай важливо.
Тип Maybe визначено так:
type Maybe a = Nothing | Just a
У термінології Elm це називають визначенням «власного типу».
Воно означає, що значення цього типу може бути або Nothing, або Just чимось типу a.
Створити значення Maybe можна за допомогою одного з його двох конструкторів: Nothing і Just.
Щоб дістати вміст Maybe, застосовують зіставлення зі зразком.
matthieu : Maybe String
matthieu = Just "Matthieu"
anon : Maybe String
anon = Nothing
sayHello : Maybe String -> String
sayHello maybeName =
case maybeName of
Nothing -> "Hello, World!"
Just someName -> "Hello, " ++ someName ++ "!"
sayHello matthieu
--> "Hello, Matthieu!"
sayHello anon
--> "Hello, World!"
У модулі Maybe також є чимало корисних функцій для роботи з типами Maybe.
sayHelloAgain : Maybe String -> String
sayHelloAgain name = "Hello, " ++ Maybe.withDefault "World" name ++ "!"
capitalizeName : Maybe String -> Maybe String
capitalizeName name = Maybe.map String.toUpper name
capitalizeName matthieu
--> Just "MATTHIEU"
capitalizeName anon
--> Nothing
У цій вправі ми реалізуємо механіки рольової гри. Персонаж гравця описаний таким типом:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
Гравці в цій грі повинні досягти 10 рівня, перш ніж відкриють запас мани, щоб почати читати закляття. У цій грі ми працюємо над двома частинами функціональності: механікою відродження і механікою читання заклять.
Напишіть вміст функції introduce.
Потайливі гравці можуть приховувати своє імʼя, і тоді їх представлять як "Mighty Magician".
Інакше просто скористайтеся своїм імʼям, щоб представитися.
introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
--> "Mighty Magician"
introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
--> "Merlin"
Функція revive повинна перевірити, що персонаж гравця справді мертвий (його здоровʼя досягло 0).
Якщо так, вона повертає новий примірник Player зі здоровʼям 100.
Інакше, якщо персонаж гравця не мертвий, функція revive повертає Nothing.
Якщо рівень гравця 10 або вищий, його також відроджують зі 100 одиницями мани.
Якщо рівень гравця нижчий за 10, його мана має бути Nothing.
Функція revive повинна зберегти рівень гравця.
deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }
revive deadPlayer
--> Just { name = Nothing, level = 2, health = 100, mana = Nothing }
Якщо метод revive викликати для гравця, чиє здоровʼя 1 або більше, то функція повертає Nothing.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
Функція castSpell приймає як аргументи Int, що вказує, скільки мани коштує закляття, а також Player.
Вона повертає оновленого гравця, а також обсяг шкоди, якої завдає прочитане закляття.
Успішне читання закляття завдає шкоди, що дорівнює подвоєній витраті мани на закляття.
Однак, якщо гравцеві бракує мани, нічого не відбувається: гравець лишається незмінним, і шкоди не завдано.
Якщо гравець навіть не має запасу мани, спроба прочитати закляття повинна зменшити його здоровʼя на витрату мани на закляття й не завдає жодної шкоди.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.