Parcours
/
Haskell
Haskell
/
Exercices
/
La Saint-Valentin
La Saint-Valentin

La Saint-Valentin

Exercice d'apprentissage

Introduction

Un type de données algébrique (ADT) représente un nombre fixe de cas nommés. Chaque valeur d'un ADT correspond à exactement un de ces cas nommés.

Un ADT se définit à l'aide du mot-clé data, ses cas étant séparés par le caractère pipe (|). Si aucun des cas ne porte de donnée associée, l'ADT est semblable à ce que d'autres langages appellent généralement une énumération (ou enum).

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

Chaque cas d'un ADT peut éventuellement porter une donnée associée, et différents cas peuvent porter différents types de données. Lorsqu'un cas porte une donnée associée, un constructeur est nécessaire.

data Number
  = NInt Int      --'NInt' is the constructor for an Int Number.
  | NFloat Float  --'NFloat' is the constructor for an Float Number.
  | Invalid       --'Invalid' does not have data associated to it.

Créer une valeur pour un cas donné se fait en référençant son nom (par exemple, NInt 22). Comme les noms de cas ne sont que des fonctions constructrices, la donnée associée peut être passée comme un argument de fonction ordinaire.

Les ADT ont une égalité structurelle, ce qui signifie que deux valeurs du même cas, avec les mêmes données (optionnelles), sont équivalentes.

Bien que l'on puisse utiliser des expressions if/else pour manipuler les ADT, la manière recommandée de les traiter est le filtrage par motifs à l'aide de l'instruction case :

add1 :: Number -> String
add1 number =
    case number of
      NInt    i -> show (i + 1)
      NFloat  f -> show (f + 1.0)
      Invalid   -> error "Invalid input"

Instructions

Dans cet exercice, c'est la Saint-Valentin et tu réfléchis à ce que tu vas faire avec ton partenaire. Ton partenaire a plein d'idées et te demande de les évaluer afin de trouver la meilleure activité.

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 ton activité de la 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 : yes, no ou maybe.

Définis le type de données algébrique Approval pour représenter ces options avec les trois cas suivants : Yes, No ou Maybe.

2. Définis les cuisines

Ton partenaire a sélectionné deux restaurants possibles : l'un de cuisine coréenne et l'autre de cuisine turque.

Définis le type de données algébrique Cuisine pour représenter ces restaurants avec les deux cas suivants : Korean ou Turkish.

3. Définis les genres de films

Il y a des tonnes de films parmi lesquels choisir, alors pour réduire le choix, ton partenaire précise aussi son genre préféré.

Définis le type de données algébrique Genre pour représenter les cas de genre suivants : Crime, Horror, Romance ou Thriller.

4. Définis l'activité

Comme on l'a vu, ton partenaire a proposé cinq activités possibles : jouer à un jeu de société, se détendre, regarder un film, aller au restaurant et faire une promenade.

Définis le type de données algébrique Activity pour représenter ces types d'activités :

  • BoardGame : aucune donnée associée.
  • Chill : aucune donnée associée.
  • Movie : a son Genre comme donnée associée.
  • Restaurant : a sa Cuisine comme donnée associée.
  • Walk : a un Int représentant le nombre de kilomètres à parcourir comme donnée associée.

5. Évalue l'activité

Enfin, le moment est venu d'évaluer les idées de ton partenaire. Voici ton ressenti sur l'idée de ton partenaire :

  • Jouer à un jeu de société : no.
  • Se détendre : no.
  • Regarder un film : yes s'il s'agit d'un film romantique ; sinon, no.
  • Aller au restaurant : yes si la cuisine est coréenne, maybe si elle est turque.
  • Faire une promenade : yes si la promenade fait moins de trois kilomètres ; maybe si elle fait entre trois et cinq kilomètres (bornes comprises) ; sinon, no.

Implémente une fonction nommée rateActivity qui prend une valeur Activity et renvoie la valeur Approval correspondant aux ressentis ci-dessus. Par exemple :

rateActivity (Restaurant Turkish)
-- -> Maybe
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Haskell Exercism

Prêt à commencer La Saint-Valentin ?

Inscris-toi sur Exercism pour apprendre et maîtriser Haskell avec 107 exercices, et un vrai mentorat humain, le tout gratuitement.