O tipo Maybe é a solução da linguagem Elm para valores opcionais.
Por isso, ele aparece nas assinaturas de tipo de um grande número de funções centrais do Elm, e entendê-lo é fundamental.
O tipo Maybe é definido assim:
type Maybe a = Nothing | Just a
Isso é conhecido como uma definição de "custom type" na terminologia do Elm.
Ela indica que um valor desse tipo pode ser Nothing OU ser Just alguma coisa do tipo a.
Para criar um valor Maybe, usamos um dos seus dois construtores: Nothing e Just.
Para ler o conteúdo de um Maybe, usamos casamento de padrões.
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!"
Existem também várias funções úteis no módulo Maybe para manipular tipos 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
Neste exercício, você vai implementar as mecânicas de um jogo de RPG. O personagem de um jogador é representado pelo seguinte tipo:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
Os jogadores deste jogo precisam alcançar o nível 10 antes de desbloquear um reservatório de mana, para só então começarem a lançar feitiços. Você vai trabalhar em duas funcionalidades deste jogo: a mecânica de reviver e a mecânica de lançar feitiços.
Escreva o conteúdo da função introduce.
Jogadores furtivos podem estar escondendo o nome e serão apresentados como "Mighty Magician".
Caso contrário, use apenas o seu nome para se apresentar.
introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
--> "Mighty Magician"
introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
--> "Merlin"
A função revive deve verificar se o personagem do jogador está de fato morto (a saúde dele chegou a 0).
Se estiver, ela deve retornar uma nova instância de Player com 100 de saúde.
Caso contrário, se o personagem do jogador não estiver morto, a função revive retorna Nothing.
Se o nível do jogador for 10 ou mais, ele também deve ser revivido com 100 de mana.
Se o nível do jogador for menor que 10, a mana dele deve ser Nothing.
A função revive deve preservar o nível do jogador.
deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }
revive deadPlayer
--> Just { name = Nothing, level = 2, health = 100, mana = Nothing }
Se o método revive for chamado em um jogador cuja saúde é 1 ou mais, então a função deve retornar Nothing.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
A função castSpell recebe como argumentos um Int indicando quanta mana o feitiço custa, além de um Player.
Ela retorna o jogador atualizado, bem como a quantidade de dano que o feitiço lançado causa.
Um feitiço lançado com sucesso causa dano igual a duas vezes o custo de mana do feitiço.
No entanto, se o jogador não tiver mana suficiente, nada acontece: o jogador permanece igual e nenhum dano é causado.
Se o jogador nem sequer tiver um reservatório de mana, tentar lançar o feitiço deve diminuir a saúde dele no valor do custo de mana do feitiço e não causa dano.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28
Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.