Les types personnalisés en Elm représentent un nombre fixe de cas nommés. Chaque valeur correspond à exactement l'un de ces cas nommés.
Un type personnalisé se définit à l'aide du mot-clé type et demande très peu de syntaxe. C'est l'une des techniques les plus importantes de la programmation en Elm, et elle sert à faire correspondre exactement les valeurs possibles dans le code aux valeurs valides de la vie réelle, ce qui ne laisse aucune place aux données invalides et rend impossible la représentation dans le code d'états impossibles.
type Season
= Spring
| Summer
| Autumn
| Winter
Chaque cas d'un type personnalisé peut éventuellement porter des données qui lui sont associées, et différents cas peuvent porter des données de types différents. Si aucun des cas ne porte de données, l'union discriminée ressemble à ce que d'autres langages appellent généralement une énumération (ou enum).
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
On peut créer une valeur pour un cas précis en faisant référence à son nom (Spring) lorsqu'il est défini dans le même module, ou importé avec la syntaxe import SeasonModule exposing (Season(..)), ou bien en utilisant son nom pleinement qualifié (Season.Spring) lorsqu'il est importé avec la syntaxe import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
Les types personnalisés, comme tout le reste en Elm, possèdent une égalité structurelle, ce qui signifie que deux valeurs du même cas, avec les mêmes données (facultatives), sont équivalentes.
La façon privilégiée de manipuler les types personnalisés est le filtrage par motif :
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
Dans cet exercice, c'est la Saint-Valentin et tu prévois de faire quelque chose de sympa avec ton partenaire. Ton partenaire a plein d'idées et te demande maintenant de les noter, afin de trouver l'activité à faire.
Les idées suivantes sont proposées par ton partenaire :
Tu as six tâches pour t'aider à choisir ton activité de la Saint-Valentin.
Pour chaque idée que ton partenaire propose, tu réponds avec l'une des trois options : oui, non ou peut-être.
Définis le type personnalisé Approval pour représenter ces options par les trois cas suivants : Yes, No et Maybe.
Ton partenaire a choisi deux restaurants possibles : l'un basé sur la cuisine coréenne et l'autre sur la cuisine turque.
Définis le type personnalisé Cuisine pour représenter ces cuisines par les deux cas suivants : Korean et Turkish.
Il y a des tonnes de films au choix, alors pour réduire les possibilités, ton partenaire indique aussi leur genre.
Définis le type personnalisé Genre pour représenter les genres suivants comme cas : Crime, Horror, Romance et Thriller.
Comme dit plus haut, ton partenaire a proposé cinq activités différentes : jouer à un jeu de société, se détendre, regarder un film et aller au restaurant.
Définis le type personnalisé 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.Enfin, tu peux noter les idées de ton partenaire. Voici ce que tu ressens à propos de l'idée de ton partenaire :
Implémente une fonction nommée rateActivity qui prend une valeur Activity et renvoie une valeur Approval en fonction des sentiments ci-dessus :
rateActivity (Restaurant Turkish)
-- => Maybe
Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.