Fsharp Pattern Matching Fsharp Pattern Matching Fsharp Pattern Matching
Pattern Matching در #F
Pattern Matching در #F یا تطبیق الگو به شما امکان می دهد “مقایسه داده ها با ساختار یا ساختار منطقی، تجزیه داده ها به قسمت های تشکیل دهنده، یا استخراج اطلاعات از داده ها به روش های مختلف “.
به عبارت دیگر، آن را یک روش انعطاف پذیر تر و قدرتمند برای تست داده ها در برابر یک سری از شرایط را فراهم می کند و انجام برخی از محاسبات بر اساس شرایط متقابل است.
به طور مفهومی، آن مانند یک سری …if سپس اظهارات است.
سینتکس
در شرایط بالایی، تطابق الگو با سینتکس زیر در #F می باشد.
1 2 3 4 5 | match expr with | pat1 - result1 | pat2 -> result2 | pat3 when expr2 -> result3 | _ -> defaultResult |
این جا
- هر | نماد یک شرط را تعریف می کند.
- نماد -> به معنای “اگر شرط درست است، این مقدار “…value را بازگردان .
- نماد _ الگوی پیش فرض را فراهم می کند، به این معنی که آن را با سایر چیزهایی مانند یک wildcard منطبق می کند.
مثال
مثال زیر، محاسبات اعداد فیبوناچی را با استفاده از سینتکس الگوی تطبیق نشان می دهد.
1 2 3 4 5 6 7 | 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) |
خروجی
1 2 3 4 5 6 7 8 9 10 | 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 |
شما همچنین می توانید چندین شرط زنجیره ای را اعمال نمایید،که همان مقدار را بازگرداند. به عنوان مثال:
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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" |
خروجی
1 2 3 4 | Winter Spring Autumn Rainy |
توابع تطبیق الگو یا Pattern Matching در #F
#F به شما اجازه می دهد تا توابع تطبیق الگو را با استفاده از کلید واژه function بنویسید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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") |
خروجی
1 2 3 4 5 | 10 20.5 21 8.75 15 |
اضافه کردن Filters یا Guards به الگوها در #F
شما می توانید فیلترها یا Guards را به الگوها زمانی که از کلمه کلیدی استفاده می کنند اضافه کنید.
مثال
1 2 3 4 5 6 7 8 | 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) |
خروجی
1 2 3 | -1 1 0 |
مثال
1 2 3 4 5 6 7 8 9 | 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) |
خروجی
1 2 3 | 11 is less than 25 72 is greater than 10 0 equals 0 |
الگوی تطبیق با Tuples در #F
مثال زیر نشان دهنده الگوی تطبیق با Tuples در #F است.
1 2 3 4 5 6 7 8 9 10 11 | 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")) |
خروجی
1 2 3 | Hello, Zara Hello, Raman from the department of Computer Sc. You are not registered into the system |
الگوی تطبیق با Records در #F
مثال زیر الگوی مطابقت با Records را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 | 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 } |
خروجی
1 2 3 4 | 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). |
Pattern Matching در #F یا تطبیق الگو به شما امکان می دهد “مقایسه داده ها با ساختار یا ساختار منطقی، تجزیه داده ها به قسمت های تشکیل دهنده، یا استخراج اطلاعات از داده ها به روش های مختلف “.