Quand une variante de type personnalisé contient des données, on parle d'un enregistrement, et chaque valeur contenue réside dans un champ.
pub type Rectangle {
Rectangle(
Float, // The first field
Float, // The second field
)
}
Pour faciliter la lisibilité, Gleam permet d'étiqueter les champs avec un nom.
pub type Rectangle {
Rectangle(
width: Float,
height: Float,
)
}
Les étiquettes permettent de passer les arguments dans n'importe quel ordre au constructeur d'un enregistrement.
let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)
a == b
// -> True
Quand un type personnalisé ne possède qu'une seule variante, on peut utiliser la syntaxe d'accès .label pour obtenir les champs d'un enregistrement.
let rect = Rectangle(height: 10.0, width: 20.0)
rect.height // -> 10.0
rect.width // -> 20.0
Quand un type personnalisé n'a qu'une seule variante, la syntaxe de mise à jour d'enregistrement permet de créer un nouvel enregistrement à partir d'un enregistrement existant, en remplaçant certains champs par de nouvelles valeurs.
let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)
tall_rect.height // -> 50.0
tall_rect.width // -> 20.0
Les étiquettes servent aussi lors du filtrage par motif pour extraire des valeurs d'un enregistrement.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, width: _) if h >. 20.0 -> True
_ -> False
}
}
Si on ne veut filtrer que sur certains champs, on peut utiliser l'opérateur de propagation .. pour ignorer les champs restants.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, ..) if h >. 20.0 -> True
_ -> False
}
}
Dans cet exercice, tu es un grand fan de sport et tu viens de découvrir une passion pour le basket NBA. Comme tu débutes dans le basket NBA, tu explores en profondeur l'histoire de la NBA, tu suis les équipes, les entraîneurs et leurs statistiques de victoires et de défaites, et tu les compares entre eux.
Comme tu n'as pas encore d'équipe favorite, tu vas aussi développer un algorithme pour déterminer si tu dois supporter une équipe en particulier.
Tu disposes de sept tâches pour t'aider à développer ton propre algorithme root-for-a-team.
Définis l'enregistrement Coach avec les deux champs suivants :
name : le nom de l'entraîneur, de type String.former_player : indique si l'entraîneur était un ancien joueur, de type Bool.Définis l'enregistrement Stats avec les deux champs suivants :
wins : le nombre de victoires, de type Int.losses : le nombre de défaites, de type Int.Définis l'enregistrement Team avec les trois champs suivants :
name : le nom de l'équipe, de type String.coach : l'entraîneur de l'équipe, de type Coach.stats : les statistiques de l'équipe, de type Stats.Implémente la fonction create_coach qui prend le nom de l'entraîneur et son statut d'ancien joueur comme paramètres, et renvoie son enregistrement Coach :
create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)
Implémente la fonction create_stats qui prend le nombre de victoires et le nombre de défaites comme paramètres, et renvoie son enregistrement Stats :
create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)
Implémente la fonction create_team qui prend le nom de l'équipe, son entraîneur et ses statistiques comme paramètres, et renvoie son enregistrement Team :
let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Larry Bird", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
Les propriétaires de la NBA étant impatients, tu as constaté que de mauvais résultats d'équipe entraînaient souvent le remplacement de l'entraîneur. Implémente la fonction replace_coach qui prend l'équipe et son nouvel entraîneur comme paramètres, et renvoie l'équipe avec le nouvel entraîneur :
let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)
let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
Pendant que tu explores les statistiques, tu tiens des listes d'équipes et de leurs statistiques. Parfois, tu te trompes et il y a des doublons dans ta liste. Implémente la fonction is_same_team qui prend deux équipes et renvoie True s'il s'agit de la même équipe, sinon renvoie False :
let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)
let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)
is_same_team(pacers_team, lakers_team)
// -> False
Après avoir étudié de nombreuses équipes et de nombreux matchs, tu as mis au point un algorithme. Si l'une des conditions suivantes est vraie, tu supportes cette équipe :
Implémente la fonction root_for_team qui prend une équipe et renvoie True si tu dois supporter cette équipe, sinon renvoie False :
let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.