Une union discriminée est un type qui représente un nombre fixe de cas nommés. Chaque valeur d'une union discriminée correspond à exactement un de ces cas nommés.
Une union discriminée se définit à l'aide du mot-clé type, en séparant les cas par des barres verticales (|) :
type Season =
| Spring
| Summer
| Autumn
| Winter
Chaque cas d'une union discriminée peut éventuellement avoir des données qui lui sont associées, et les différents cas peuvent avoir des types de données différents. Si aucun des cas n'a de données associées, l'union discriminée s'apparente à ce que d'autres langages appellent généralement une énumération (ou enum).
type Number =
| Integer of int
| Float of float
| Invalid
Pour créer une valeur d'un cas donné, il suffit de faire référence à son nom (par exemple Success). Comme les noms de cas ne sont que des fonctions de construction, les données associées peuvent être passées comme un argument de fonction classique. Si une autre union discriminée a défini un cas portant le même nom, tu devras utiliser son nom complet (par exemple Result.Success).
let byName = Integer 2
let byFullName = Number.Invalid
Les unions discriminées ont une égalité structurelle, ce qui signifie que deux valeurs du même cas, avec les mêmes données (facultatives), sont équivalentes.
Même s'il est possible d'utiliser des expressions if/elif/else pour manipuler les unions discriminées, la méthode recommandée pour les manipuler est le filtrage par motif, au moyen du motif d'identificateur :
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"
Dans cet exercice, c'est la Saint-Valentin et ton partenaire et toi prévoyez de faire quelque chose de sympa ensemble. Ton partenaire a plein d'idées et te demande maintenant de les évaluer, afin de choisir l'activité à faire.
Ton partenaire te propose les idées suivantes :
Tu as six tâches pour t'aider à choisir l'activité de ta Saint-Valentin.
Pour chaque idée proposée par ton partenaire, tu réponds par l'une des trois options suivantes : oui, non ou peut-être.
Définis l'union discriminée Approval pour représenter ces options sous la forme des trois cas suivants : Yes, No et Maybe.
Ton partenaire a retenu deux restaurants possibles : l'un de cuisine coréenne, l'autre de cuisine turque.
Définis l'union discriminée Cuisine pour représenter ces cuisines sous la forme des deux cas suivants : Korean et Turkish.
Il y a des tonnes de films parmi lesquels choisir, donc pour réduire le champ des possibles, ton partenaire précise aussi leur genre.
Définis l'union discriminée Genre pour représenter les genres suivants sous forme de cas : Crime, Horror, Romance et Thriller.
Comme on l'a dit, ton partenaire a proposé cinq activités différentes : jouer à un jeu de société, se détendre, regarder un film, aller au restaurant et faire une promenade.
Définis l'union discriminée Activity pour représenter ces types d'activités :
BoardGame : aucune donnée associée.Chill : aucune donnée associée.Movie : possède son Genre comme donnée associée.Restaurant : possède sa Cuisine comme donnée associée.Walk : possède un int comme donnée associée, qui représente le nombre de kilomètres à parcourir.Enfin, il est temps d'évaluer les idées de ton partenaire. Voici ce que tu penses de chacune d'elles :
Implémente une fonction nommée rateActivity qui prend une valeur Activity et renvoie la valeur Approval correspondante aux sentiments ci-dessus :
rateActivity (Restaurant Turkish)
// => Maybe
Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.