F # - Khớp mẫu
So khớp mẫu cho phép bạn “so sánh dữ liệu với cấu trúc hoặc cấu trúc logic, phân tách dữ liệu thành các phần cấu thành hoặc trích xuất thông tin từ dữ liệu theo nhiều cách khác nhau”.
Nói cách khác, nó cung cấp một cách linh hoạt và mạnh mẽ hơn để kiểm tra dữ liệu dựa trên một loạt các điều kiện và thực hiện một số tính toán dựa trên điều kiện được đáp ứng.
Về mặt khái niệm, nó giống như một chuỗi các câu lệnh if… then.
Cú pháp
Trong các thuật ngữ cấp cao, đối sánh mẫu tuân theo cú pháp này trong F # -
match expr with
| pat1 - result1
| pat2 -> result2
| pat3 when expr2 -> result3
| _ -> defaultResult
Ở đâu,
- Mỗi | biểu tượng xác định một điều kiện.
- Biểu tượng -> có nghĩa là "nếu điều kiện là đúng, hãy trả về giá trị này ...".
- Biểu tượng _ cung cấp mẫu mặc định, có nghĩa là nó khớp với tất cả những thứ khác như ký tự đại diện.
ví dụ 1
Ví dụ sau, tính toán các số Fibonacci bằng cách sử dụng cú pháp đối sánh mẫu -
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)
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
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
Bạn cũng có thể xâu chuỗi nhiều điều kiện với nhau để trả về cùng một giá trị. Ví dụ -
Ví dụ 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"
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
Winter
Spring
Autumn
Rainy
Chức năng đối sánh mẫu
F # cho phép bạn viết các hàm đối sánh mẫu bằng cách sử dụng function từ khóa -
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")
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
10
20.5
21
8.75
15
Thêm bộ lọc hoặc bộ bảo vệ vào mẫu
Bạn có thể thêm bộ lọc hoặc bộ bảo vệ vào các mẫu bằng cách sử dụng when từ khóa.
ví dụ 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)
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
-1
1
0
Ví dụ 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)
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
11 is less than 25
72 is greater than 10
0 equals 0
Khớp mẫu với Tuples
Ví dụ sau minh họa cách đối sánh mẫu với các bộ giá trị:
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"))
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
Hello, Zara
Hello, Raman from the department of Computer Sc.
You are not registered into the system
Khớp mẫu với bản ghi
Ví dụ sau minh họa việc đối sánh mẫu với các bản ghi:
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 }
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
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).