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"


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow