F # - Mustervergleich
Mit dem Mustervergleich können Sie „Daten mit einer oder mehreren logischen Strukturen vergleichen, Daten in Bestandteile zerlegen oder Informationen auf verschiedene Weise aus Daten extrahieren“.
Mit anderen Worten, es bietet eine flexiblere und leistungsfähigere Möglichkeit, Daten anhand einer Reihe von Bedingungen zu testen und einige Berechnungen basierend auf der erfüllten Bedingung durchzuführen.
Konzeptionell ist es wie eine Reihe von if… then-Aussagen.
Syntax
Auf hoher Ebene folgt der Mustervergleich dieser Syntax in F # -
match expr with
| pat1 - result1
| pat2 -> result2
| pat3 when expr2 -> result3
| _ -> defaultResult
Wo,
- Jeder | Symbol definiert eine Bedingung.
- Das Symbol -> bedeutet "Wenn die Bedingung erfüllt ist, geben Sie diesen Wert zurück ...".
- Das _-Symbol stellt das Standardmuster bereit, dh es stimmt mit allen anderen Dingen wie einem Platzhalter überein.
Beispiel 1
Im folgenden Beispiel werden die Fibonacci-Zahlen mithilfe der Mustervergleichssyntax berechnet.
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)
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
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
Sie können auch mehrere Bedingungen miteinander verketten, die denselben Wert zurückgeben. Zum Beispiel -
Beispiel 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"
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
Winter
Spring
Autumn
Rainy
Pattern Matching-Funktionen
Mit F # können Sie Mustervergleichsfunktionen mit der Taste schreiben function Schlüsselwort -
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")
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
10
20.5
21
8.75
15
Hinzufügen von Filtern oder Schutzvorrichtungen zu Mustern
Sie können den Mustern mithilfe von Filter oder Schutzvorrichtungen hinzufügen when Stichwort.
Beispiel 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)
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
-1
1
0
Beispiel 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)
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
11 is less than 25
72 is greater than 10
0 equals 0
Musterübereinstimmung mit Tupeln
Das folgende Beispiel zeigt den Mustervergleich mit Tupeln -
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"))
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
Hello, Zara
Hello, Raman from the department of Computer Sc.
You are not registered into the system
Musterabgleich mit Datensätzen
Das folgende Beispiel zeigt den Mustervergleich mit Datensätzen -
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 }
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
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).