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