Une expression if/elif/else permet d'exécuter de la logique de façon conditionnelle. F# propose également une autre façon, plus puissante, d'exécuter de la logique de façon conditionnelle : le filtrage par motif. Avec le filtrage par motif, on peut tester une valeur par rapport à un ou plusieurs motifs. Un exemple d'un tel motif est le motif constant, qui compare une valeur à une constante (par exemple 1 ou "hello").
En F#, le filtrage par motif se fait à l'aide du mot-clé match :
let describe number =
match number with
| 0 -> "Zero"
| 1 -> "One"
Même si cela peut ressembler à des instructions switch dans d'autres langages, le filtrage par motif révèle tout son intérêt lorsqu'on utilise aussi d'autres motifs. L'un de ces motifs est le motif de variable, qui permet de capturer une valeur :
match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i
Dans certains cas, tu peux vouloir ajouter une condition supplémentaire à un motif. C'est ce qu'on appelle une garde (clause), que l'on peut ajouter à l'aide du mot-clé when :
match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"
Dans l'exemple ci-dessus, il n'y a pas forcément de motif correspondant pour toutes les entrées possibles. Le compilateur le détecte et émet un avertissement. C'est ce qu'on appelle la vérification d'exhaustivité. Pour faire disparaître l'avertissement, il faut gérer tous les cas. Pour cela, on peut utiliser le motif joker, qui correspond à n'importe quelle valeur :
match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"
// No compiler warning
Le filtrage par motif teste une valeur par rapport à chaque motif, de haut en bas, jusqu'à ce qu'il trouve un motif correspondant et exécute la logique associée à ce motif. L'ordre des motifs compte !
Dans cet exercice, on joue à un jeu de devinettes avec un ami. Les règles sont simples : tu choisis secrètement un nombre entre 1 et 100, et ton ami essaie de deviner le nombre que tu as choisi. Pour aider ton ami, tu réponds différemment selon la proximité entre sa proposition et le nombre que tu as choisi (42). Voici les règles pour les différentes réponses :
42 : « Correct »41 ou 43 : « So close »41 : « Too low »43 : « Too high »Quatre tâches t'attendent pour coder les réponses aux propositions.
Implémente la fonction reply pour répondre à une proposition correcte :
reply 42
// => "Correct"
Modifie la fonction reply pour répondre aux propositions proches :
reply 41
// => "So close"
Modifie la fonction reply pour répondre aux propositions trop basses :
reply 25
// => "Too low"
Modifie la fonction reply pour répondre aux propositions trop hautes :
reply 88
// => "Too high"
Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.