F # - Pencocokan Pola
Pencocokan pola memungkinkan Anda untuk "membandingkan data dengan struktur atau struktur logis, menguraikan data menjadi bagian-bagian penyusun, atau mengekstrak informasi dari data dengan berbagai cara".
Dengan kata lain, ini memberikan cara yang lebih fleksibel dan kuat untuk menguji data terhadap serangkaian kondisi dan melakukan beberapa komputasi berdasarkan kondisi yang dipenuhi.
Secara konseptual, ini seperti serangkaian pernyataan jika… maka.
Sintaksis
Dalam istilah tingkat tinggi, pencocokan pola mengikuti sintaks ini di F # -
match expr with
| pat1 - result1
| pat2 -> result2
| pat3 when expr2 -> result3
| _ -> defaultResult
Dimana,
- Setiap | simbol mendefinisikan suatu kondisi.
- Simbol -> berarti "jika kondisinya benar, kembalikan nilai ini ...".
- Simbol _ menyediakan pola default, artinya pola tersebut cocok dengan semua hal lain seperti wildcard.
Contoh 1
Contoh berikut, menghitung angka Fibonacci menggunakan sintaks pencocokan pola -
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)
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
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
Anda juga dapat merangkai beberapa kondisi, yang mengembalikan nilai yang sama. Misalnya -
Contoh 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"
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
Winter
Spring
Autumn
Rainy
Fungsi Pencocokan Pola
F # memungkinkan Anda untuk menulis fungsi pencocokan pola menggunakan function kata kunci -
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")
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
10
20.5
21
8.75
15
Menambahkan Filter atau Penjaga ke Pola
Anda dapat menambahkan filter, atau penjaga, ke pola menggunakan when kata kunci.
Contoh 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)
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
-1
1
0
Contoh 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)
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
11 is less than 25
72 is greater than 10
0 equals 0
Pencocokan Pola dengan Tuple
Contoh berikut menunjukkan pola yang cocok dengan tupel -
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"))
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
Hello, Zara
Hello, Raman from the department of Computer Sc.
You are not registered into the system
Pencocokan Pola dengan Rekaman
Contoh berikut menunjukkan pola yang cocok dengan catatan -
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 }
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
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).