En Gleam, les types personnalisés permettent de définir de nouveaux types de données. Ils peuvent avoir plusieurs variantes, chacune avec son propre nom.
pub type Season {
Spring
Summer
Autumn
Winter
}
Chaque cas d'un type personnalisé peut, éventuellement, contenir des données, et différents cas peuvent contenir des types de données différents. Quand une variante contient des données, on parle d'un enregistrement.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
Pour créer une valeur pour un cas précis, on peut faire référence à son nom s'il ne contient aucune donnée supplémentaire (Spring), ou l'appeler comme une fonction s'il en contient (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
Les types personnalisés, comme tout ce qui existe en Gleam, possèdent une égalité structurelle, ce qui signifie que deux valeurs de la même variante et portant les mêmes données sont équivalentes.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
On peut filtrer par motif les variantes d'un type personnalisé à l'aide d'expressions case.
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
Dans cet exercice, c'est la Saint-Valentin et ton partenaire et toi préparez quelque chose de sympa à faire ensemble. Ton partenaire a plein d'idées et te demande maintenant de les évaluer, 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 l'activité de la Saint-Valentin.
Pour chaque idée que ton partenaire propose, tu réponds par l'une de trois options : oui, non ou peut-être.
Définis le type personnalisé Approval pour représenter ces options sous forme des trois cas suivants : Yes, No et Maybe.
Ton partenaire a sélectionné deux restaurants possibles : l'un de cuisine coréenne et l'autre de cuisine turque.
Définis le type personnalisé Cuisine pour représenter ces cuisines sous forme des deux cas suivants : Korean et Turkish.
Il y a des tonnes de films parmi lesquels choisir, alors pour réduire le champ des possibles, ton partenaire précise aussi leur genre.
Définis le type personnalisé Genre pour représenter les genres suivants sous forme de 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, aller au restaurant et faire une balade.
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 comme donnée associée son Genre.Restaurant : a comme donnée associée sa Cuisine.Walk : a comme donnée associée un Int qui représente le nombre de kilomètres à parcourir.Enfin, tu es prêt à évaluer les idées de ton partenaire. Voici ce que tu penses de l'idée de ton partenaire :
Implémente une fonction nommée rate_activity qui prend une valeur Activity et renvoie l'Approval selon les préférences ci-dessus :
rate_activity(Restaurant(Turkish))
// -> Maybe
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.