F # - Örüntü Eşleştirme
Model eşleştirme, "verileri mantıksal bir yapı veya yapılarla karşılaştırmanıza, verileri oluşturan parçalara ayırmanıza veya verilerden çeşitli şekillerde bilgi çıkarmanıza" olanak tanır.
Diğer bir deyişle, verileri bir dizi koşula karşı test etmek ve karşılanan koşula göre bazı hesaplamalar yapmak için daha esnek ve güçlü bir yol sağlar.
Kavramsal olarak, bir dizi eğer ... sonra ifadeleri gibidir.
Sözdizimi
Üst düzey terimlerle, desen eşleştirme bu sözdizimini F # 'da izler -
match expr with
| pat1 - result1
| pat2 -> result2
| pat3 when expr2 -> result3
| _ -> defaultResult
Nerede,
- Her biri | sembolü bir koşulu tanımlar.
- -> sembolü, "koşul doğruysa, bu değeri döndür ..." anlamına gelir.
- _ Sembolü varsayılan kalıbı sağlar, yani joker karakter gibi diğer tüm şeylerle eşleşir.
örnek 1
Aşağıdaki örnek, desen eşleştirme sözdizimini kullanarak Fibonacci sayılarını hesaplar -
let rec fib n =
match n with
| 0 -> 0
| 1 -> 1
| _ -> fib (n - 1) + fib (n - 2)
for i = 1 to 10 do
printfn "Fibonacci %d: %d" i (fib i)
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
Fibonacci 1: 1
Fibonacci 2: 1
Fibonacci 3: 2
Fibonacci 4: 3
Fibonacci 5: 5
Fibonacci 6: 8
Fibonacci 7: 13
Fibonacci 8: 21
Fibonacci 9: 34
Fibonacci 10: 55
Ayrıca, aynı değeri döndüren birden çok koşulu birbirine zincirleyebilirsiniz. Örneğin -
Örnek 2
let printSeason month =
match month with
| "December" | "January" | "February" -> printfn "Winter"
| "March" | "April" -> printfn "Spring"
| "May" | "June" -> printfn "Summer"
| "July" | "August" -> printfn "Rainy"
| "September" | "October" | "November" -> printfn "Autumn"
| _ -> printfn "Season depends on month!"
printSeason "February"
printSeason "April"
printSeason "November"
printSeason "July"
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
Winter
Spring
Autumn
Rainy
Desen Eşleştirme İşlevleri
F #, şablon eşleştirme işlevlerini kullanarak function anahtar kelime -
let getRate = function
| "potato" -> 10.00
| "brinjal" -> 20.50
| "cauliflower" -> 21.00
| "cabbage" -> 8.75
| "carrot" -> 15.00
| _ -> nan (* nan is a special value meaning "not a number" *)
printfn "%g"(getRate "potato")
printfn "%g"(getRate "brinjal")
printfn "%g"(getRate "cauliflower")
printfn "%g"(getRate "cabbage")
printfn "%g"(getRate "carrot")
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
10
20.5
21
8.75
15
Modellere Filtreler veya Muhafızlar Ekleme
Kullanarak desenlere filtre veya korumalar ekleyebilirsiniz. when anahtar kelime.
örnek 1
let sign = function
| 0 -> 0
| x when x < 0 -> -1
| x when x > 0 -> 1
printfn "%d" (sign -20)
printfn "%d" (sign 20)
printfn "%d" (sign 0)
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
-1
1
0
Örnek 2
let compareInt x =
match x with
| (var1, var2) when var1 > var2 -> printfn "%d is greater than %d" var1 var2
| (var1, var2) when var1 < var2 -> printfn "%d is less than %d" var1 var2
| (var1, var2) -> printfn "%d equals %d" var1 var2
compareInt (11,25)
compareInt (72, 10)
compareInt (0, 0)
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
11 is less than 25
72 is greater than 10
0 equals 0
Tuples ile Desen Eşleştirme
Aşağıdaki örnek, tuples ile desen eşleştirmesini gösterir -
let greeting (name, subject) =
match (name, subject) with
| ("Zara", _) -> "Hello, Zara"
| (name, "English") -> "Hello, " + name + " from the department of English"
| (name, _) when subject.StartsWith("Comp") -> "Hello, " + name + " from the department of Computer Sc."
| (_, "Accounts and Finance") -> "Welcome to the department of Accounts and Finance!"
| _ -> "You are not registered into the system"
printfn "%s" (greeting ("Zara", "English"))
printfn "%s" (greeting ("Raman", "Computer Science"))
printfn "%s" (greeting ("Ravi", "Mathematics"))
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
Hello, Zara
Hello, Raman from the department of Computer Sc.
You are not registered into the system
Kayıtlarla Örüntü Eşleştirme
Aşağıdaki örnek kayıtlarla örüntü eşleştirmeyi gösterir -
type Point = { x: float; y: float }
let evaluatePoint (point: Point) =
match point with
| { x = 0.0; y = 0.0 } -> printfn "Point is at the origin."
| { x = xVal; y = 0.0 } -> printfn "Point is on the x-axis. Value is %f." xVal
| { x = 0.0; y = yVal } -> printfn "Point is on the y-axis. Value is %f." yVal
| { x = xVal; y = yVal } -> printfn "Point is at (%f, %f)." xVal yVal
evaluatePoint { x = 0.0; y = 0.0 }
evaluatePoint { x = 10.0; y = 0.0 }
evaluatePoint { x = 0.0; y = 10.0 }
evaluatePoint { x = 10.0; y = 10.0 }
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
Point is at the origin.
Point is on the x-axis. Value is 10.000000.
Point is on the y-axis. Value is 10.000000.
Point is at (10.000000, 10.000000).