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"
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:
Você tem seis tarefas para ajudar a escolher a atividade do Dia dos Namorados.
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.
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.
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.
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.Por fim, você está pronto para avaliar as ideias do seu parceiro. É assim que você se sente sobre a ideia dele:
Implemente uma função chamada rateActivity que recebe um valor Activity e retorna o Approval com base nos sentimentos acima:
rateActivity (Restaurant Turkish)
// => Maybe
Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.