Trilhas
/
F#
F#
/
Exercícios
/
Dia dos Namorados
Dia dos Namorados

Dia dos Namorados

Exercício de aprendizagem

Introdução

Uniões discriminadas

O tipo união discriminada representa um número fixo de casos nomeados. Cada valor de uma união discriminada corresponde a exatamente um dos casos nomeados.

Uma união discriminada é definida com a palavra-chave type, com os casos separados por caracteres de barra vertical (|):

type Season =
    | Spring
    | Summer
    | Autumn
    | Winter

Cada caso de uma união discriminada pode ou não ter dados associados, e casos diferentes podem ter tipos de dados diferentes. Se nenhum dos casos tiver dados associados, a união discriminada é parecida com o que outras linguagens costumam chamar de enumeração (ou enum).

type Number =
    | Integer of int
    | Float of float
    | Invalid

Você cria um valor para um caso específico referindo-se ao seu nome (por exemplo, Success). Como os nomes dos casos são apenas funções construtoras, os dados associados podem ser passados como um argumento comum de função. Se outra união discriminada já definiu um caso com o mesmo nome, você vai precisar usar o nome completo (por exemplo, Result.Success).

let byName = Integer 2
let byFullName = Number.Invalid

As uniões discriminadas têm igualdade estrutural, o que significa que dois valores do mesmo caso e com os mesmos dados (opcionais) são equivalentes.

Embora você possa usar expressões if/elif/else para trabalhar com uniões discriminadas, a forma recomendada é a correspondência de padrões, usando o padrão de identificador:

let describe number =
    match number with
    | Integer i -> sprintf "Integer: %d" i
    | Float d  -> sprintf "Float: %f" d
    | Invalid   -> "Invalid"

Instruções

Neste exercício, é Dia dos Namorados e você e seu parceiro estão planejando fazer algo legal juntos. Seu parceiro tem muitas ideias e agora está pedindo que você avalie cada uma delas, para descobrir qual atividade curtir.

As ideias a seguir são propostas pelo seu parceiro:

  • 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 a atividade do Dia dos Namorados.

1. Defina a aprovação

Para cada ideia que seu parceiro propõe, você responde com uma de três opções: yes, no ou maybe.

Defina a união discriminada Approval para representar essas opções com os três casos a seguir: Yes, No e Maybe.

2. Defina as culinárias

Seu parceiro selecionou dois restaurantes possíveis: um baseado na culinária coreana e o outro na culinária turca.

Defina a união discriminada Cuisine para representar essas culinárias com os dois casos a seguir: Korean e Turkish.

3. Defina os gêneros de filme

Há uma infinidade de filmes para escolher, então, para reduzir as opções, seu parceiro também informa o gênero.

Defina a união discriminada Genre para representar os seguintes gêneros como casos: Crime, Horror, Romance e Thriller.

4. Defina a atividade

Como dito, seu parceiro pensou em cinco atividades diferentes: jogar um jogo de tabuleiro, relaxar, assistir a um filme, ir a um restaurante e dar uma caminhada.

Defina a união discriminada Activity para representar esses tipos de atividade:

  • BoardGame: sem dados associados.
  • Chill: sem dados associados.
  • Movie: tem seu Genre como dado associado.
  • Restaurant: tem sua Cuisine como dado associado.
  • Walk: tem um int que representa o número de quilômetros a caminhar como dado associado.

5. Avalie a atividade

Por fim, você está pronto para avaliar as ideias do seu parceiro. É assim que você se sente sobre a ideia dele:

  • Jogar um jogo de tabuleiro: no.
  • Relaxar: no.
  • Assistir a um filme: yes se for um filme romântico; caso contrário, no.
  • Ir a um restaurante: yes se a culinária for coreana, maybe se for turca.
  • Dar uma caminhada: yes se a caminhada for menor que três quilômetros; maybe se for menor que cinco quilômetros; caso contrário, no.

Implemente uma função chamada rateActivity que recebe um valor Activity e retorna o Approval com base nos sentimentos acima:

rateActivity (Restaurant Turkish)
// => Maybe
Editar via GitHub O link abre em uma nova janela ou aba
F# Exercism

Tudo pronto para começar Dia dos Namorados?

Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.