Match ifadeleri
matchİfade, bir ifadenin bir dizi deseniyle karşılaştırmasını temel alan dallanma denetimi sağlar.
Syntax
// 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 dizi desenle bir test ifadesinin karşılaştırmasına bağlı olarak karmaşık dallandırma sağlar. matchİfadede, Test ifadesi her bir düzen ile karşılaştırılır ve bir eşleşme bulunduğunda, karşılık gelen Sonuç ifadesi değerlendirilir ve elde edilen değer, eşleşme ifadesinin değeri olarak döndürülür.
Önceki sözdiziminde gösterilen model eşleştirme işlevi, bir lambda ifadesidir ve bu ifade, bağımsız değişkende hemen bu düzende yapılır. Önceki sözdiziminde gösterilen kalıp eşleştirme işlevi aşağıdaki gibidir.
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 ifadeleri: fun anahtar sözcüğü.
Tüm desen kümesi, giriş değişkeninin tüm olası eşleşmelerini kapsamalıdır. Genellikle, _ daha önce eşleşmeyen giriş değerleriyle eşleştirmek için en son model olarak () joker karakter stilini kullanın.
Aşağıdaki kod, ifadenin kullanıldığı bazı yolları gösterir match . Bir başvuru ve kullanılabilecek tüm olası desenlerin örnekleri 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
Desenlerdeki koruyucular
whenDeğişkenin bir düzeniyle eşleştirmek için karşılaması gereken ek bir koşul belirtmek için bir yan tümce kullanabilirsiniz. Böyle bir yan tümce koruma olarak adlandırılır. Anahtar sözcüğünü izleyen ifade, when Bu Guard ile ilişkili bir eşleme yapılmadığı takdirde değerlendirilmez.
Aşağıdaki örnek, bir değişken deseninin sayısal aralığını belirtmek için bir koruyucu kullanımını gösterir. Birden çok koşulun Boole işleçleri kullanılarak birleştirildiğine 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ğerlerin, düzende kullanılmadığından, when girişin bazı bölümlerini bir değere göre karşılaştırmanız gerekiyorsa, bir yan tümce kullanmanız gerektiğini unutmayın. Bu, aşağıdaki kodda gösterilmiştir:
// 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
Bir birleşim deseninin bir koruyucu kapsamında ele alındığına, koruanın yalnızca son bir değil, Tüm desenlere uygulandığını unutmayın. Örneğin, aşağıdaki kod verildiğinde, koruma when a > 12 hem hem de için geçerlidir A a B a :
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