Um Tipo de Dados Algébrico (Algebraic Data Type, ADT) representa um número fixo de casos nomeados. Cada valor de um ADT corresponde a exatamente um dos casos nomeados.
Um ADT é definido com a palavra-chave data, com os casos separados pelo caractere de barra vertical (|).
Se nenhum dos casos tiver dados associados, o ADT é semelhante ao que outras linguagens costumam chamar de enumeração (ou enum).
data Season
= Spring
| Summer
| Autumn
| Winter
Cada caso de um ADT pode, opcionalmente, ter dados associados, e casos diferentes podem ter tipos de dados diferentes. Quando o caso tem dados associados, um construtor é obrigatório.
data Number
= NInt Int --'NInt' is the constructor for an Int Number.
| NFloat Float --'NFloat' is the constructor for an Float Number.
| Invalid --'Invalid' does not have data associated to it.
Criar um valor para um caso específico é feito referindo-se ao seu nome (por exemplo, NInt 22).
Como os nomes dos casos são apenas funções construtoras, os dados associados podem ser passados como um argumento comum de função.
Os ADTs têm igualdade estrutural, o que significa que dois valores do mesmo caso e com os mesmos dados (opcionais) são equivalentes.
Embora seja possível usar expressões if/else para trabalhar com ADTs, a forma recomendada de trabalhar com eles é por meio de correspondência de padrões, usando a instrução case:
add1 :: Number -> String
add1 number =
case number of
NInt i -> show (i + 1)
NFloat f -> show (f + 1.0)
Invalid -> error "Invalid input"
Neste exercício, é Dia dos Namorados e você está planejando o que fazer com seu par. Seu par tem muitas ideias e está pedindo que você avalie as ideias, para encontrar a melhor atividade.
Seu par propõe as seguintes ideias:
Você tem seis tarefas para ajudar a escolher sua atividade de Dia dos Namorados.
Para cada ideia que seu par propõe, você responde com uma de três opções: sim, não ou talvez.
Defina o tipo de dados algébrico Approval para representar essas opções nos três casos a seguir: Yes, No ou Maybe.
Seu par selecionou dois restaurantes possíveis: um baseado em culinária coreana e o outro baseado em culinária turca.
Defina o tipo de dados algébrico Cuisine para representar esses restaurantes nos dois casos a seguir: Korean ou Turkish.
Há muitos filmes para escolher, então, para reduzir as opções, seu par também lista o gênero de sua preferência.
Defina o tipo de dados algébrico Genre para representar os seguintes casos de gênero: Crime, Horror, Romance ou Thriller.
Como mencionado, seu par pensou em cinco atividades possíveis: jogar um jogo de tabuleiro, relaxar, assistir a um filme, ir a um restaurante e dar uma caminhada.
Defina o tipo de dados algébrico Activity para representar estes tipos de atividade:
BoardGame: sem dados associados.Chill: sem dados associados.Movie: tem Genre como dados associados.Restaurant: tem Cuisine como dados associados.Walk: tem um Int representando o número de quilômetros a caminhar como dados associados.Por fim, chegou a hora de avaliar as ideias do seu par. É assim que você se sente em relação às ideias do seu par:
Implemente uma função chamada rateActivity que recebe um valor Activity e retorna o Approval com base nos sentimentos acima.
Por exemplo:
rateActivity (Restaurant Turkish)
-- -> Maybe
Crie sua conta no Exercism para aprender e dominar Haskell com 107 exercícios e mentoria humana de verdade, tudo de graça.