Percursos
/
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 com nome. Cada valor de uma união discriminada corresponde a exatamente um dos casos com nome.

Uma união discriminada define-se com a palavra-chave type, com os casos separados por carateres pipe (|):

type Season =
    | Spring
    | Summer
    | Autumn
    | Winter

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

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

Criar um valor para um caso específico pode ser feito referindo o 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 normal de função. Se outra união discriminada tiver definido um caso com o mesmo nome, tens de 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 se possam usar expressões if/elif/else para trabalhar com uniões discriminadas, a forma recomendada de o fazer é através da correspondência de padrões, com 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, é o Dia dos Namorados e tu e o teu parceiro estão a planear fazer algo agradável juntos. O teu parceiro tem muitas ideias e está agora a pedir-te para as avaliares, para escolherem a atividade a realizar.

O teu parceiro 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 ajudar a escolher a tua atividade do Dia dos Namorados.

1. Define a aprovação

Para cada ideia que o teu parceiro propõe, respondes com uma de três opções: sim, não ou talvez.

Define a união discriminada Approval para representar estas opções como os seguintes três casos: Yes, No e Maybe.

2. Define as cozinhas

O teu parceiro selecionou dois restaurantes possíveis: um baseado na cozinha coreana e o outro na cozinha turca.

Define a união discriminada Cuisine para representar estas cozinhas como os seguintes dois casos: Korean e Turkish.

3. Define os géneros de filmes

Há imensos filmes para escolher, por isso, para reduzir as opções, o teu parceiro também indica o género.

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

4. Define a atividade

Como foi dito, o teu parceiro sugeriu cinco atividades diferentes: jogar um jogo de tabuleiro, relaxar, ver um filme, ir a um restaurante e dar um passeio.

Define a união discriminada Activity para representar estes tipos de atividade:

  • 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 percorrer como dados associados.

5. Avalia a atividade

Finalmente, estás pronto para avaliar as ideias do teu parceiro. É assim que te sentes em relação à ideia do teu parceiro:

  • 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 for inferior a três quilómetros; talvez, se for inferior a cinco quilómetros; 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:

rateActivity (Restaurant Turkish)
// => Maybe
Editar via GitHub A ligação abre numa nova janela ou separador
F# Exercism

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

Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.