Suche…
Bemerkungen
Pattern Matching ist eine leistungsstarke Funktion in vielen funktionalen Sprachen, da Verzweigungen häufig im Vergleich zur Verwendung mehrerer if
/ else if
/ else
Anweisungen sehr präzise gehandhabt werden können. Wenn Sie jedoch genügend Optionen und "Wann" -Wächter haben , kann Pattern Matching auf einen Blick auch verbos und schwer verständlich werden.
In diesem Fall können die Active Patterns von F # eine hervorragende Möglichkeit sein, der Abgleichlogik sinnvolle Namen zu geben, was den Code vereinfacht und die Wiederverwendung ermöglicht.
Übereinstimmende Optionen
Musterabgleich kann hilfreich sein, um mit Optionen umzugehen:
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
Mustervergleichsüberprüfungen der gesamten Domäne werden abgedeckt
let x = true
match x with
| true -> printfn "x is true"
gibt eine Warnung aus
C: \ Programme (x86) \ Microsoft VS Code \ Untitled-1 (2,7): Warnung FS0025: Unvollständiges Muster stimmt mit diesem Ausdruck überein. Zum Beispiel kann der Wert 'false' auf einen Fall hinweisen, der nicht durch die Muster abgedeckt ist.
Dies liegt daran, dass nicht alle möglichen bool-Werte abgedeckt wurden.
bools können explizit aufgelistet werden, aber es ist schwieriger, sie aufzulisten
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
Hier verwenden wir das Sonderzeichen _
. Das _
stimmt mit allen anderen möglichen Fällen überein.
Der _
kann Sie in Schwierigkeiten bringen
Betrachten wir einen Typ, den wir selbst erstellen, sieht es so aus
type Sobriety =
| Sober
| Tipsy
| Drunk
Wir könnten ein Match mit Expession schreiben, das so aussieht
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
Der obige Code ist sinnvoll. Wenn Sie nicht nüchtern sind, gehen wir davon aus, dass Sie eine Uber anrufen sollten, damit wir das _
angeben
Wir überarbeiten unseren Code später darauf
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
Der F # -Compiler sollte uns eine Warnung geben und uns auffordern, unseren Übereinstimmungsausdruck zu ändern, damit die Person einen Arzt aufsucht. Stattdessen behandelt der Übereinstimmungsausdruck die unbewusste Person stumm, als ob sie nur angetrunken wäre. Der Punkt ist, dass Sie sich dazu entscheiden sollten, Fälle explizit aufzulisten, wenn möglich, um logische Fehler zu vermeiden.
Die Fälle werden von oben nach unten ausgewertet und die erste Übereinstimmung wird verwendet
Falsche Verwendung:
Im folgenden Snippet wird das letzte Match niemals verwendet:
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"
druckt
x ist alles, was oben nicht aufgeführt wurde
Richtige Benutzung:
Hier treffen sowohl x = 1
als auch x = 4
auf ihre spezifischen Fälle, während alles andere auf den Standardfall _
fällt:
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"
druckt
x ist 4
Bei Wachen können Sie beliebige Bedingungen hinzufügen
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"