Il tipo Maybe è la soluzione nel linguaggio Elm per i valori opzionali.
È quindi presente nelle firme di tipo di molte funzioni principali di Elm e comprenderlo è fondamentale.
Il tipo Maybe è definito come segue:
type Maybe a = Nothing | Just a
Questa è nota come definizione di «custom type» nella terminologia di Elm.
Indica che un valore di questo tipo può essere Nothing oppure Just qualcosa di tipo a.
Creare un valore Maybe avviene tramite uno dei suoi due costruttori Nothing e Just.
Leggere il contenuto di un Maybe avviene tramite il pattern matching.
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!"
Ci sono anche diverse funzioni utili nel modulo Maybe per manipolare i tipi 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
In questo esercizio, implementerai le meccaniche di un gioco di ruolo. Il personaggio di un giocatore è rappresentato dal seguente tipo:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
In questo gioco, i giocatori devono raggiungere il livello 10 prima di sbloccare una riserva di mana, così da poter iniziare a lanciare incantesimi. Stai lavorando a due funzionalità di questo gioco: la meccanica di rianimazione e quella di lancio degli incantesimi.
Scrivi il contenuto della funzione introduce.
I giocatori furtivi potrebbero nascondere il proprio nome e verranno presentati come "Mighty Magician".
Altrimenti, usa semplicemente il tuo nome per presentarti.
introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
--> "Mighty Magician"
introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
--> "Merlin"
La funzione revive deve controllare che il personaggio del giocatore sia effettivamente morto (la sua salute ha raggiunto 0).
Se lo è, deve restituire una nuova istanza di Player con 100 di salute.
Altrimenti, se il personaggio del giocatore non è morto, la funzione revive restituisce Nothing.
Se il livello del giocatore è pari o superiore a 10, deve essere rianimato anche con 100 di mana.
Se il livello del giocatore è inferiore a 10, il suo mana deve essere Nothing.
La funzione revive deve preservare il livello del giocatore.
deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }
revive deadPlayer
--> Just { name = Nothing, level = 2, health = 100, mana = Nothing }
Se il metodo revive viene chiamato su un giocatore la cui salute è pari o superiore a 1, la funzione deve restituire Nothing.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
La funzione castSpell prende come argomenti un Int che indica quanto mana costa l'incantesimo, oltre a un Player.
Restituisce il giocatore aggiornato, oltre alla quantità di danno che l'incantesimo lanciato infligge.
Un incantesimo lanciato con successo infligge un danno pari al doppio del costo in mana dell'incantesimo.
Tuttavia, se il giocatore ha mana insufficiente, non succede nulla, il giocatore rimane invariato e non viene inflitto alcun danno.
Se il giocatore non ha nemmeno una riserva di mana, il tentativo di lanciare l'incantesimo deve ridurre la sua salute del costo in mana dell'incantesimo e non infliggere alcun danno.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28
Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.