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"
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:
Tens seis tarefas para ajudar a escolher a tua atividade do Dia dos Namorados.
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.
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.
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.
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.Finalmente, estás pronto para avaliar as ideias do teu parceiro. É assim que te sentes em relação à ideia do teu parceiro:
Implementa uma função chamada rateActivity que recebe um valor Activity e devolve o Approval com base nos sentimentos acima:
rateActivity (Restaurant Turkish)
// => Maybe
Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.