Parcours
/
F#
F#
/
Programme
/
Filtrage par motif
Fi

Filtrage par motif en F#

1 exercice

À propos de Filtrage par motif

On peut utiliser une expression if/elif/else pour exécuter du code de manière conditionnelle. F# dispose aussi d'une autre manière, plus puissante, d'exécuter du code de manière conditionnelle : le filtrage par motif. Avec le filtrage par motif, on peut comparer une valeur à 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 s'effectue avec le mot-clé match :

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

Même si cela ressemble aux instructions switch d'autres langages, le filtrage par motif révèle toute sa puissance lorsqu'on utilise aussi d'autres motifs. 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

Il peut arriver que l'on veuille ajouter une condition supplémentaire à un motif. C'est ce qu'on appelle une garde (clause), que l'on peut ajouter avec le mot-clé when :

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

Une clause de garde peut être n'importe quelle expression valide, y compris l'appel de fonctions.

Dans l'exemple ci-dessus, toutes les entrées possibles n'ont pas forcément de motif correspondant. Le compilateur le détecte et affiche un avertissement. C'est ce qu'on appelle le filtrage exhaustif. Pour faire disparaître l'avertissement, il faut traiter tous les cas. Pour cela, on peut utiliser le [motif générique][wildcard-pattern], qui correspond à n'importe quelle valeur :

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

Note que le compilateur ne peut pas se servir des clauses when pour déduire que le filtrage est exhaustif :

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

Le filtrage par motif compare une valeur à chaque motif, de haut en bas, jusqu'à ce qu'il trouve un motif correspondant et exécute le code associé à ce motif. L'ordre des motifs est important ! Par conséquent, le motif générique doit toujours être le dernier motif d'une expression match.

Le filtrage par motif est très puissant, mais une logique conditionnelle simple s'exprime généralement plus clairement avec une expression if/else :

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Filtrage par motif