Trilhas
/
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 (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"

Instruções

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:

  • Jogar um jogo de tabuleiro
  • Relaxar
  • Assistir a um filme
  • Ir a um restaurante
  • Dar uma caminhada

Você tem seis tarefas para ajudar a escolher sua atividade de Dia dos Namorados.

1. Defina a aprovação

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.

2. Defina as culinárias

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.

3. Defina os gêneros de filmes

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.

4. Defina a atividade

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.

5. Avalie a atividade

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:

  • Jogar um jogo de tabuleiro: não.
  • Relaxar: não.
  • Assistir a um filme: sim, se for um filme romântico; caso contrário, não.
  • Ir a um restaurante: sim, se a culinária for Korean, talvez se for Turkish.
  • Dar uma caminhada: sim, se a caminhada for menos de três quilômetros; talvez se for entre três e cinco quilômetros (inclusive); caso contrário, não.

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
Editar via GitHub O link abre em uma nova janela ou aba
Haskell Exercism

Tudo pronto para começar Dia dos Namorados?

Crie sua conta no Exercism para aprender e dominar Haskell com 107 exercícios e mentoria humana de verdade, tudo de graça.