Der Maybe-Typ ist die Lösung in der Sprache Elm für optionale Werte.
Er taucht daher in den Typsignaturen vieler Elm-Kernfunktionen auf, und ihn zu verstehen ist entscheidend.
Der Maybe-Typ ist wie folgt definiert:
type Maybe a = Nothing | Just a
In der Elm-Terminologie nennt man das eine „Custom Type“-Definition.
Er zeigt an, dass ein Wert dieses Typs entweder Nothing oder Just etwas vom Typ a sein kann.
Einen Maybe-Wert erstellst du mit einem seiner beiden Konstruktoren Nothing und Just.
Den Inhalt eines Maybe-Werts liest du mit Pattern Matching aus.
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!"
Außerdem gibt es im Maybe-Modul eine Reihe nützlicher Funktionen, mit denen du Maybe-Typen bearbeiten kannst.
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
In dieser Übung implementierst du die Mechaniken eines Rollenspiels. Die Spielfigur eines Spielers wird durch den folgenden Typ dargestellt:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
Spieler in diesem Spiel müssen Level 10 erreichen, bevor sie einen Manavorrat freischalten, damit sie Zauber wirken können. Du arbeitest in diesem Spiel an zwei Mechaniken: dem Wiederbeleben und dem Zauberwirken.
Schreibe den Inhalt der introduce-Funktion.
Heimliche Spieler verbergen möglicherweise ihren Namen und werden als "Mighty Magician" vorgestellt.
Ansonsten stellst du dich einfach mit deinem Namen vor.
introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
--> "Mighty Magician"
introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
--> "Merlin"
Die revive-Funktion sollte prüfen, dass die Spielfigur tatsächlich tot ist (ihre Gesundheit hat 0 erreicht).
Wenn ja, sollte sie eine neue Player-Instanz mit 100 Gesundheit zurückgeben.
Andernfalls, wenn die Spielfigur nicht tot ist, gibt die revive-Funktion Nothing zurück.
Wenn das Level des Spielers 10 oder höher ist, sollte er auch mit 100 Mana wiederbelebt werden.
Wenn das Level des Spielers unter 10 liegt, sollte sein Mana Nothing sein.
Die revive-Funktion sollte das Level des Spielers beibehalten.
deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }
revive deadPlayer
--> Just { name = Nothing, level = 2, health = 100, mana = Nothing }
Wenn die revive-Methode für einen Spieler aufgerufen wird, dessen Gesundheit 1 oder höher ist, sollte die Funktion Nothing zurückgeben.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
Die castSpell-Funktion nimmt als Argumente einen Int, der angibt, wie viel Mana der Zauber kostet, sowie einen Player.
Sie gibt den aktualisierten Spieler sowie die Menge an Schaden zurück, den der gewirkte Zauber verursacht.
Ein erfolgreich gewirkter Zauber verursacht Schaden in Höhe des Doppelten der Manakosten des Zaubers.
Wenn der Spieler jedoch nicht genug Mana hat, passiert nichts: Der Spieler bleibt unverändert und es wird kein Schaden verursacht.
Wenn der Spieler nicht einmal einen Manavorrat hat, muss der Versuch, den Zauber zu wirken, seine Gesundheit um die Manakosten des Zaubers verringern und verursacht keinen Schaden.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28
Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.