Um Tipo de Dados Algébrico (ADT) representa um número fixo de casos com nome. Cada valor de um ADT corresponde a exatamente um dos casos com nome.
Um ADT define-se com a palavra-chave data, com os casos separados por carateres 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, é necessário um construtor.
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 pode fazer-se referindo o 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 normal de uma 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 se possam usar expressões if/else para trabalhar com ADTs, a forma recomendada de o fazer é através 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, é o Dia dos Namorados e estás a planear o que fazer com a tua cara-metade. A tua cara-metade tem imensas ideias e pede-te para as avaliares, para encontrarem a melhor atividade.
A tua cara-metade propõe as seguintes ideias:
Tens seis tarefas para te ajudar a escolher a atividade do Dia dos Namorados.
Para cada ideia que a tua cara-metade propõe, respondes com uma de três opções: sim, não ou talvez.
Define o tipo de dados algébrico Approval para representar estas opções nos três casos seguintes: Yes, No ou Maybe.
A tua cara-metade escolheu dois restaurantes possíveis: um baseado em cozinha coreana e o outro em cozinha turca.
Define o tipo de dados algébrico Cuisine para representar estes restaurantes nos dois casos seguintes: Korean ou Turkish.
Há imensos filmes para escolher, por isso, para reduzir as opções, a tua cara-metade também indica o género preferido.
Define o tipo de dados algébrico Genre para representar os seguintes casos de géneros: Crime, Horror, Romance ou Thriller.
Como já referimos, a tua cara-metade sugeriu cinco atividades possíveis: jogar um jogo de tabuleiro, relaxar, ver um filme, ir a um restaurante e dar um passeio.
Define o tipo de dados algébrico Activity para representar estes tipos de atividades:
BoardGame: sem dados associados.Chill: sem dados associados.Movie: tem o seu Genre como dados associados.Restaurant: tem a sua Cuisine como dados associados.Walk: tem um Int que representa o número de quilómetros a caminhar como dados associados.Finalmente, está na hora de avaliares as ideias da tua cara-metade. É assim que te sentes em relação à ideia da tua cara-metade:
Implementa uma função chamada rateActivity que recebe um valor Activity e devolve o Approval com base nos sentimentos acima.
Por exemplo:
rateActivity (Restaurant Turkish)
-- -> Maybe
Inscreve-te no Exercism para aprenderes e dominares Haskell com 107 exercícios, e mentoria humana real, tudo grátis.