Sdílet prostřednictvím


Výrazy shody (F#)

match Výraz poskytuje větvení ovládací prvek, který je založen na srovnání výraz s sady vzorů.

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

Poznámky

Výrazy odpovídající vzorek umožnit složité větvení na základě porovnání testovací výraz s sady vzorů.V match výraz, test-expression je ve srovnání s každý vzorek v tahu a je nalezena shoda, odpovídající result-expression je vyhodnocena a výsledná hodnota vrácena jako hodnota odpovídající výrazu.

Funkce, které jsou uvedeny v předchozí syntaxe pro porovnávání se lambda výraz, který vzorek odpovídající proběhne okamžitě na argument.Je ekvivalentní následující funkce, které jsou uvedeny v předchozí syntaxe pro porovnávání se vzorky.

fun arg ->

odpovídají arg s

| pattern1 whencondition -> result-expression1

| pattern2 whencondition-> result-expression2

| ...

Další informace o výrazech lambda, viz Výrazy lambda: Klíčové slovo fun (F#).

Celé sady vzorů by měla zahrnovat všechny možné odpovídá vstupní proměnné.Často použít vzor zástupných (_) jako poslední vzorek odpovídající jakékoli dříve neporovnané vstupní hodnoty.

Následující kód ilustruje některé způsoby, v němž match výrazu.Odkaz a příklady možných vzorky, které lze použít, naleznete v Porovnávání vzorů (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

Kryty na vzorky

Můžete použít when klauzule určit další podmínku, že proměnná musí splňovat odpovídající vzorek.Tato klauzule je označována jako guard.Následující výraz when klíčové slovo není vyhodnocena, pokud odpovídající vzorek spojené s tímto guard.

Následující příklad ukazuje použití guard zadat číselný rozsah proměnné vzorek.Všimněte si, že pomocí logické operátory jsou společně více podmínek.

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

Protože nelze použít jiné hodnoty než literály ve vzorku, musí použít when klauzule, máte-li některá část vstupní proti hodnotu porovnat.To je ukázáno v následujícím kódu.

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

Viz také

Referenční dokumentace

Aktivní vzorky (F#)

Další zdroje

Referenční dokumentace jazyka F#