Percursos
/
Haskell
Haskell
/
Exercícios
/
Dia dos Namorados
Dia dos Namorados

Dia dos Namorados

Exercício de aprendizagem

Introdução

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"

Instruções

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:

  • Jogar um jogo de tabuleiro
  • Relaxar
  • Ver um filme
  • Ir a um restaurante
  • Dar um passeio

Tens seis tarefas para te ajudar a escolher a atividade do Dia dos Namorados.

1. Define a aprovação

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.

2. Define as cozinhas

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.

3. Define os géneros de filmes

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.

4. Define a atividade

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.

5. Avalia a atividade

Finalmente, está na hora de avaliares as ideias da tua cara-metade. É assim que te sentes em relação à ideia da tua cara-metade:

  • Jogar um jogo de tabuleiro: não.
  • Relaxar: não.
  • Ver um filme: sim, se for um filme romântico; caso contrário, não.
  • Ir a um restaurante: sim, se a cozinha for coreana; talvez, se for turca.
  • Dar um passeio: sim, se o passeio tiver menos de três quilómetros; talvez, se tiver entre três e cinco quilómetros (inclusive); caso contrário, não.

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
Editar via GitHub A ligação abre numa nova janela ou separador
Haskell Exercism

Estás pronto para começar Dia dos Namorados?

Inscreve-te no Exercism para aprenderes e dominares Haskell com 107 exercícios, e mentoria humana real, tudo grátis.