Parcours
/
F#
F#
/
Exercices
/
La Saint-Valentin
La Saint-Valentin

La Saint-Valentin

Exercice d'apprentissage

Introduction

Unions discriminées

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"

Instructions

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 :

  • Jouer à un jeu de société
  • Se détendre
  • Regarder un film
  • Aller au restaurant
  • Faire une promenade

Tu as six tâches pour t'aider à choisir l'activité de ta Saint-Valentin.

1. Définis l'approbation

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.

2. Définis les cuisines

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.

3. Définis les genres de films

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.

4. Définis l'activité

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.

5. Évalue l'activité

Enfin, il est temps d'évaluer les idées de ton partenaire. Voici ce que tu penses de chacune d'elles :

  • Jouer à un jeu de société : non.
  • Se détendre : non.
  • Regarder un film : oui s'il s'agit d'un film romantique, sinon non.
  • Aller au restaurant : oui si la cuisine est coréenne, peut-être si elle est turque.
  • Faire une promenade : oui si la promenade fait moins de trois kilomètres, peut-être si elle fait moins de cinq kilomètres, sinon non.

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
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
F# Exercism

Prêt à commencer La Saint-Valentin ?

Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.