Expressions match (F#)
L'expression match fournit le contrôle de branchement basé sur la comparaison d'une expression à un jeu de modèles.
// Match expression.
match test-expression with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ] -> result-expression2
| ...
// Pattern matching function.
function
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ] -> result-expression2
| ...
Notes
Les expressions de critères spéciaux autorisent des branchements complexes basés sur la comparaison d'une expression de test à un jeu de modèles.Dans l'expression match, test-expression est comparé tour à tour à chaque modèle. Lorsqu'une correspondance est trouvée, le result-expression correspondant est évalué et la valeur résultante est retournée comme valeur de l'expression match.
La fonction de critères spéciaux indiquée dans la syntaxe précédente est une expression lambda dans laquelle des critères spéciaux sont exécutés immédiatement sur l'argument.La fonction de critères spéciaux indiquée dans la syntaxe précédente est équivalente à ce qui suit.
fun arg ->
match arg with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ]-> result-expression2
| ...
Pour plus d'informations sur les expressions lambda, consultez Expressions lambda : mot clé fun (F#).
Le jeu entier de modèles doit couvrir toutes les correspondances possibles de la variable d'entrée.Il est courant d'utiliser le modèle de caractère générique (_) comme dernier modèle pour mettre en correspondance les valeurs d'entrée précédemment sans correspondance.
Le code suivant illustre quelques-unes des utilisations de l'expression match.Pour obtenir une référence et des exemples de tous les modèles pouvant être utilisés, consultez Critères spéciaux (F#).
let list1 = [ 1; 5; 100; 450; 788 ]
// Pattern matching by using the cons pattern and a list
// pattern that tests for an empty list.
let rec printList listx =
match listx with
| head :: tail -> printf "%d " head; printList tail
| [] -> printfn ""
printList list1
// Pattern matching with multiple alternatives on the same line.
let filter123 x =
match x with
| 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
| a -> printfn "%d" a
// The same function written with the pattern matching
// function syntax.
let filterNumbers =
function | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
| a -> printfn "%d" a
Gardes sur des modèles
Vous pouvez utiliser une clause when pour spécifier une condition supplémentaire à laquelle la variable doit satisfaire pour correspondre à un modèle.Une telle clause est appelée garde.L'expression après le mot clé when n'est pas évaluée, sauf si une correspondance est établie au modèle associé à ce garde.
L'exemple suivant illustre l'utilisation d'un garde pour spécifier une plage numérique pour un modèle de variable.Notez que plusieurs conditions sont combinées à l'aide d'opérateurs booléens.
let rangeTest testValue mid size =
match testValue with
| var1 when var1 >= mid - size/2 && var1 <= mid + size/2 -> printfn "The test value is in range."
| _ -> printfn "The test value is out of range."
rangeTest 10 20 5
rangeTest 10 20 10
rangeTest 10 20 40
Étant donné qu'il est impossible d'utiliser des valeurs autres que des littéraux dans le modèle, vous devez utiliser une clause when si vous devez comparer une partie de l'entrée à une valeur.Cela est illustré dans le code suivant.
// This example uses patterns that have when guards.
let detectValue point target =
match point with
| (a, b) when a = target && b = target -> printfn "Both values match target %d." target
| (a, b) when a = target -> printfn "First value matched target in (%d, %d)" target b
| (a, b) when b = target -> printfn "Second value matched target in (%d, %d)" a target
| _ -> printfn "Neither value matches target."
detectValue (0, 0) 0
detectValue (1, 0) 0
detectValue (0, 10) 0
detectValue (10, 15) 0