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"


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow