F #-패턴 매칭
패턴 일치를 사용하면 "데이터를 논리적 구조 또는 구조와 비교하고, 데이터를 구성 부분으로 분해하거나, 다양한 방법으로 데이터에서 정보를 추출"할 수 있습니다.
즉, 일련의 조건에 대해 데이터를 테스트하고 충족 된 조건에 따라 일부 계산을 수행하는보다 유연하고 강력한 방법을 제공합니다.
개념적으로는 일련의 if… then 문과 같습니다.
통사론
높은 수준의 용어로, 패턴 일치는 F #에서이 구문을 따릅니다.
match expr with
| pat1 - result1
| pat2 -> result2
| pat3 when expr2 -> result3
| _ -> defaultResult
어디,
- 각각 | 기호는 조건을 정의합니다.
- -> 기호는 "조건이 참이면이 값을 반환합니다 ..."를 의미합니다.
- _ 기호는 기본 패턴을 제공합니다. 즉, 와일드 카드와 같은 다른 모든 항목과 일치합니다.
예 1
다음 예제는 패턴 일치 구문을 사용하여 피보나치 수를 계산합니다.
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)
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
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
동일한 값을 반환하는 여러 조건을 함께 연결할 수도 있습니다. 예를 들면-
예 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"
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Winter
Spring
Autumn
Rainy
패턴 매칭 기능
F #에서는 다음을 사용하여 패턴 일치 함수를 작성할 수 있습니다. function 키워드 −
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")
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
10
20.5
21
8.75
15
패턴에 필터 또는 가드 추가
다음을 사용하여 패턴에 필터 또는 가드를 추가 할 수 있습니다. when 예어.
예 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)
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
-1
1
0
예 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)
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
11 is less than 25
72 is greater than 10
0 equals 0
튜플을 사용한 패턴 매칭
다음 예제는 튜플과 일치하는 패턴을 보여줍니다.
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"))
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Hello, Zara
Hello, Raman from the department of Computer Sc.
You are not registered into the system
레코드와 패턴 매칭
다음 예제는 레코드와 일치하는 패턴을 보여줍니다-
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 }
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
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).