Ο τύπος Maybe είναι η λύση στη γλώσσα Elm για προαιρετικές τιμές.
Είναι επομένως παρών στις υπογραφές τύπων πολλών βασικών συναρτήσεων της Elm και η κατανόησή του είναι κρίσιμη.
Ο τύπος Maybe ορίζεται ως εξής:
type Maybe a = Nothing | Just a
Αυτό είναι γνωστό ως ορισμός "προσαρμοσμένου τύπου" στην ορολογία της Elm.
Υποδεικνύει ότι μια τιμή αυτού του τύπου μπορεί είτε να είναι Nothing ή να είναι Just κάτι τύπου a.
Η δημιουργία μιας τιμής Maybe γίνεται μέσω ενός από τους δύο κατασκευαστές του.
Η ανάγνωση του περιεχομένου ενός 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 προτού ξεκλειδώσουν μια δεξαμενή mana, ώστε να μπορούν να αρχίσουν να ρίχνουν ξόρκια. Δουλεύεις πάνω σε δύο κομμάτια λειτουργικότητας σε αυτό το παιχνίδι: τον μηχανισμό αναβίωσης και τον μηχανισμό ρίψης ξορκιών.
Γράψε το περιεχόμενο της συνάρτησης 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 mana.
Αν το επίπεδο του παίκτη είναι κάτω από 10, το mana του θα πρέπει να είναι 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 που δείχνει πόσο mana κοστίζει το ξόρκι, καθώς και έναν Player.
Επιστρέφει τον ενημερωμένο παίκτη, καθώς και το ποσό της ζημιάς που προκαλεί το ξόρκι που ρίχτηκε.
Ένα επιτυχημένο ξόρκι προκαλεί ζημιά ίση με το διπλάσιο του κόστους mana του ξορκιού.
Ωστόσο, αν ο παίκτης δεν έχει αρκετό mana, δεν συμβαίνει τίποτα: ο παίκτης μένει αμετάβλητος και δεν προκαλείται ζημιά.
Αν ο παίκτης δεν έχει καν δεξαμενή mana, η προσπάθεια να ρίξει το ξόρκι πρέπει να μειώσει την υγεία του κατά το κόστος mana του ξορκιού και δεν προκαλεί ζημιά.
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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.