Vergleichsausdrücke (F#)

Der match-Ausdruck stellt Verzweigungssteuerung bereit, die auf dem Vergleich eines Ausdrucks mit einem Satz von Mustern basiert.

// 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
    | ...

Hinweise

Die Mustervergleichsausdrücke ermöglichen komplexe Verzweigungen auf Grundlage des Vergleichs eines Testausdrucks mit einem Satz von Mustern. Im match-Ausdruck wird die test-expression mit jedem einzelnen Muster verglichen. Wenn eine Übereinstimmung gefunden wird, wird die entsprechende result-expression ausgewertet, und der resultierende Wert wird als Wert des Vergleichsausdrucks zurückgegeben.

Die Mustervergleichsfunktion in der vorherigen Syntax ist ein Lambda-Ausdruck, in dem der Mustervergleich direkt für das Argument ausgeführt wird. Die Mustervergleichsfunktion in der vorherigen Syntax entspricht dem folgenden Code.

fun arg ->

match arg with

| pattern1 [ when condition ] -> result-expression1

| pattern2 [ when condition ]-> result-expression2

| ...

Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambda-Ausdrücke: Das fun-Schlüsselwort (F#).

Der vollständige Satz von Mustern entspricht allen möglichen Übereinstimmungen der Eingabevariablen. Häufig wird das Platzhaltermuster (_) als letztes Muster für die Übereinstimmung mit Werten verwendet, für die noch keine Übereinstimmung gefunden wurde.

Im folgenden Code werden einige Verwendungsmöglichkeiten des match-Ausdrucks veranschaulicht. Eine Referenz und Beispiele für alle Muster, die verwendet werden können, finden Sie unter Mustervergleich (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

Wächter für Muster

Sie können mithilfe einer when-Klausel eine zusätzliche Bedingung angeben, die eine Variable erfüllen muss, damit sie mit einem Muster übereinstimmt. Eine solche Klausel wird als Wächter bezeichnet. Der Ausdruck nach dem when-Schlüsselwort wird nur ausgewertet, wenn eine Übereinstimmung mit dem Muster gefunden wird, das dem Wächter zugeordnet ist.

Im folgenden Beispiel wird veranschaulicht, wie mithilfe eines Wächters ein numerischer Bereich für ein Variablenmuster angegeben wird. Beachten Sie, dass mithilfe eines booleschen Operators mehrere Bedingungen kombiniert werden.

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

Beachten Sie, dass Sie eine when-Klausel verwenden müssen, wenn Sie einen Teil der Eingabe mit einem Wert vergleichen müssen, da Werte, die kein Literal sind, nicht im Muster verwendet werden können. Dies wird im folgenden Code veranschaulicht.

// 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

Siehe auch

Referenz

Aktive Muster (F#)

Weitere Ressourcen

F#-Sprachreferenz