F#
Correspondance de motif
Recherche…
Remarques
La correspondance de motifs est une fonctionnalité puissante de nombreux langages fonctionnels, car elle permet souvent de gérer les branchements de manière très succincte par rapport à l'utilisation de plusieurs instructions de style if
/ else if
/ else
. Cependant, compte tenu des options suffisantes et des gardes «lorsque» , la correspondance des motifs peut aussi devenir verbeuse et difficile à comprendre en un coup d’œil.
Lorsque cela se produit, les patterns actifs de F # peuvent être un excellent moyen de donner des noms significatifs à la logique correspondante, ce qui simplifie le code et permet également la réutilisation.
Options de correspondance
La correspondance de modèle peut être utile pour gérer les options:
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
La correspondance de modèle vérifie que tout le domaine est couvert
let x = true
match x with
| true -> printfn "x is true"
donne un avertissement
C: \ Program Files (x86) \ Code Microsoft Microsoft \ Untitled-1 (2,7): avertissement FS0025: correspond à un motif incomplet sur cette expression. Par exemple, la valeur 'false' peut indiquer un cas non couvert par le ou les motifs.
C'est parce que toutes les valeurs bool possibles n'ont pas été couvertes.
les bools peuvent être explicitement listés mais ints sont plus difficiles à lister
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
Ici, nous utilisons le caractère spécial _
. Le _
correspond à tous les autres cas possibles.
Le _
peut vous causer des ennuis
considérer un type que nous créons nous-mêmes, il ressemble à ceci
type Sobriety =
| Sober
| Tipsy
| Drunk
Nous pourrions écrire un match avec expession qui ressemble à ceci
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
Le code ci-dessus a du sens. Nous supposons que si vous n'êtes pas sobre, vous devriez appeler un uber afin que nous utilisions le _
pour indiquer que
Nous réorganisons plus tard notre code à ceci
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
Le compilateur F # devrait nous avertir et nous demander de modifier notre expression de correspondance pour que la personne recherche des soins médicaux. Au lieu de cela, l'expression du match traite silencieusement la personne inconsciente comme si elle était seulement éméché. Le fait est que vous devez choisir de lister explicitement les cas si possible pour éviter les erreurs de logique.
Les cas sont évalués de haut en bas et la première correspondance est utilisée
Utilisation incorrecte:
Dans l'extrait suivant, la dernière correspondance ne sera jamais utilisée:
let x = 4
match x with
| 1 -> printfn "x is 1"
| _ -> printfn "x is anything that wasn't listed above"
| 4 -> printfn "x is 4"
estampes
x est tout ce qui n'a pas été listé ci-dessus
Usage correct:
Ici, x = 1
et x = 4
atteindront leurs cas spécifiques, alors que tout le reste tombera dans le cas par défaut _
:
let x = 4
match x with
| 1 -> printfn "x is 1"
| 4 -> printfn "x is 4"
| _ -> printfn "x is anything that wasn't listed above"
estampes
x est 4
Lorsque les gardes vous permettent d'ajouter des conditions arbitraires
type Person = {
Age : int
PassedDriversTest : bool }
let someone = { Age = 19; PassedDriversTest = true }
match someone.PassedDriversTest with
| true when someone.Age >= 16 -> printfn "congrats"
| true -> printfn "wait until you are 16"
| false -> printfn "you need to pass the test"