O tipo Maybe é a solução da linguagem Elm para valores opcionais.
Está por isso presente nas assinaturas de tipo de muitas funções centrais do Elm, e compreendê-lo é crucial.
O tipo Maybe é definido da seguinte forma:
type Maybe a = Nothing | Just a
Isto é conhecido como uma definição de "tipo personalizado" na terminologia do Elm.
Indica que um valor deste tipo pode ser Nothing OU ser Just algo do tipo a.
Criar um valor Maybe faz-se através de um dos seus dois construtores, Nothing e Just.
Ler o conteúdo de um Maybe faz-se através de correspondência 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, vais implementar mecânicas de um jogo de role-playing. A personagem de um jogador é representada pelo seguinte tipo:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
Os jogadores deste jogo têm de atingir o nível 10 antes de desbloquearem uma reserva de mana, para poderem começar a lançar feitiços. Vais trabalhar em duas funcionalidades deste jogo: a mecânica de reanimação e a mecânica de lançamento de feitiços.
Escreve o conteúdo da função introduce.
Os jogadores mais furtivos podem estar a esconder o nome e serão apresentados como "Mighty Magician".
Caso contrário, usa simplesmente o teu nome para te apresentares.
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 que a personagem do jogador está de facto morta (a saúde chegou a 0).
Se estiver, deve devolver uma nova instância de Player com 100 de saúde.
Caso contrário, se a personagem do jogador não estiver morta, a função revive devolve Nothing.
Se o nível do jogador for 10 ou superior, a personagem também deve ser reanimada com 100 de mana.
Se o nível do jogador for inferior a 10, a mana deve ser Nothing.
A função revive deve manter 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 para um jogador cuja saúde seja 1 ou superior, a função deve devolver Nothing.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
A função castSpell recebe como argumentos um Int que indica quanta mana o feitiço custa, bem como um Player.
Devolve o jogador atualizado, assim como a quantidade de dano que o feitiço lançado provoca.
Um feitiço lançado com sucesso provoca dano igual ao dobro do custo de mana do feitiço.
No entanto, se o jogador não tiver mana suficiente, não acontece nada: o jogador fica inalterado e não é provocado qualquer dano.
Se o jogador não tiver sequer uma reserva de mana, tentar lançar o feitiço tem de reduzir a sua saúde no valor do custo de mana do feitiço e não provoca dano.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28
Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.