سلام درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. Pattern Matching در #F روشی انعطاف پذیرتر و قدرتمند برای تست داده ها در برابر یک سری از شرایط را فراهم می کند. توابع تطبیق الگو یا Pattern Matching رو در این قسمت داریم. بنابراین الگوی تطبیق با Tuples در #F ، الگوی تطبیق با Records و … رو بررسی می نماییم.
Pattern Matching در #F یا تطبیق الگو به شما امکان می دهد “مقایسه داده ها با ساختار یا ساختار منطقی، تجزیه داده ها به قسمت های تشکیل دهنده، یا استخراج اطلاعات از داده ها به روش های مختلف “.
به عبارت دیگر، آن را یک روش انعطاف پذیر تر و قدرتمند برای تست داده ها در برابر یک سری از شرایط را فراهم می کند و انجام برخی از محاسبات بر اساس شرایط متقابل است.
به طور مفهومی، آن مانند یک سری …if سپس اظهارات است.
در شرایط بالایی، تطابق الگو با سینتکس زیر در #F می باشد.
1 2 3 4 5 | match expr with | pat1 - result1 | pat2 -> result2 | pat3 when expr2 -> result3 | _ -> defaultResult |
این جا
مثال زیر، محاسبات اعداد فیبوناچی را با استفاده از سینتکس الگوی تطبیق نشان می دهد.
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 |
#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 |
شما می توانید فیلترها یا 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 است.
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 را نشان می دهد.
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 رو در این قسمت بررسی نمودیم و همچنین الگوی تطبیق با Tuples در #F ، الگوی تطبیق با Records و … رو بیان شد.