İfadeleri eşleştir

İfade, match bir ifadenin bir dizi desenle karşılaştırmasını temel alan dallanma denetimi sağlar.

Sözdizimi

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

Açıklamalar

Desen eşleştirme ifadeleri, bir test ifadesinin bir dizi desenle karşılaştırılması temelinde karmaşık dallanmalara olanak sağlar. İfadede match test-ifadesi sırayla her desenle karşılaştırılır ve eşleşme bulunduğunda ilgili sonuç ifadesi değerlendirilir ve sonuç değeri eşleşme ifadesinin değeri olarak döndürülür.

Önceki söz diziminde gösterilen desen eşleştirme işlevi, desen eşleştirmenin bağımsız değişken üzerinde hemen gerçekleştirildiği bir lambda ifadesidir. Önceki söz diziminde gösterilen desen eşleştirme işlevi aşağıdakine eşdeğerdir.

fun arg ->
    match arg with
    | pattern1 [ when condition ] -> result-expression1
    | pattern2 [ when condition ] -> result-expression2
    | ...

Lambda ifadeleri hakkında daha fazla bilgi için bkz . Lambda İfadeleri: Anahtar fun Sözcük.

Desen kümesinin tamamı, giriş değişkeninin tüm olası eşleşmelerini kapsamalıdır. Daha önce eşleşmeyen giriş değerleriyle eşleştirmek için sık sık joker karakter desenini (_) son desen olarak kullanırsınız.

Aşağıdaki kod, ifadenin hangi yollarla match kullanıldığını gösterir. Kullanılabilecek tüm olası desenlere yönelik başvuru ve örnekler için bkz . Desen Eşleştirme.

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

Desenler üzerinde korumalar

Değişkenin bir when desenle eşleşmesi için karşılaması gereken ek bir koşul belirtmek için yan tümcesi kullanabilirsiniz. Böyle bir yan tümce, koruyucu olarak adlandırılır. Anahtar sözcüğü izleyen when ifade, bu korumayla ilişkilendirilmiş desenle eşleşme yapılmadığı sürece değerlendirilmez.

Aşağıdaki örnekte, değişken deseni için sayısal bir aralık belirtmek üzere bir koruma kullanımı gösterilmektedir. Birden çok koşulun Boole işleçleri kullanılarak birleştirildiğini unutmayın.

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

Değişmez değerler dışındaki değerler desende kullanılamadığından, girişin bir bölümünü bir when değerle karşılaştırmanız gerekiyorsa yan tümcesi kullanmanız gerektiğini unutmayın. Bu, aşağıdaki kodda gösterilir:

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

Birleşim deseni bir koruyucu tarafından kapsandığında, koruyucunun yalnızca sonuncusuna değil tüm desenlere uygulandığını unutmayın. Örneğin, aşağıdaki kod göz önüne alındığında, koruma when a > 41 hem hem B ade A a için geçerlidir:

type Union =
    | A of int
    | B of int

let foo() =
    let test = A 42
    match test with
    | A a
    | B a when a > 41 -> a // the guard applies to both patterns
    | _ -> 1

foo() // returns 42

Ayrıca bkz.