F # - Coincidencia de patrones

La coincidencia de patrones le permite "comparar datos con una estructura o estructuras lógicas, descomponer datos en partes constituyentes o extraer información de los datos de varias formas".

En otros términos, proporciona una forma más flexible y poderosa de probar datos contra una serie de condiciones y realizar algunos cálculos basados ​​en la condición cumplida.

Conceptualmente, es como una serie de declaraciones si ... entonces.

Sintaxis

En términos de alto nivel, la coincidencia de patrones sigue esta sintaxis en F # -

match expr with
| pat1 - result1
| pat2 -> result2
| pat3 when expr2 -> result3
| _ -> defaultResult

Dónde,

  • Cada uno | El símbolo define una condición.
  • El símbolo -> significa "si la condición es verdadera, devuelve este valor ...".
  • El símbolo _ proporciona el patrón predeterminado, lo que significa que coincide con todas las demás cosas, como un comodín.

Ejemplo 1

El siguiente ejemplo, calcula los números de Fibonacci usando la sintaxis de coincidencia de patrones:

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)

Cuando compila y ejecuta el programa, produce el siguiente resultado:

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

También puede encadenar varias condiciones, que devuelven el mismo valor. Por ejemplo

Ejemplo 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"

Cuando compila y ejecuta el programa, produce el siguiente resultado:

Winter
Spring
Autumn
Rainy

Funciones de coincidencia de patrones

F # le permite escribir funciones de coincidencia de patrones usando el function palabra clave -

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")

Cuando compila y ejecuta el programa, produce el siguiente resultado:

10
20.5
21
8.75
15

Adición de filtros o protecciones a patrones

Puede agregar filtros, o protecciones, a los patrones usando el when palabra clave.

Ejemplo 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)

Cuando compila y ejecuta el programa, produce el siguiente resultado:

-1
1
0

Ejemplo 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)

Cuando compila y ejecuta el programa, produce el siguiente resultado:

11 is less than 25
72 is greater than 10
0 equals 0

Coincidencia de patrones con tuplas

El siguiente ejemplo demuestra la coincidencia de patrones con tuplas:

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"))

Cuando compila y ejecuta el programa, produce el siguiente resultado:

Hello, Zara
Hello, Raman from the department of Computer Sc.
You are not registered into the system

Coincidencia de patrones con registros

El siguiente ejemplo demuestra la coincidencia de patrones con registros:

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 }

Cuando compila y ejecuta el programa, produce el siguiente resultado:

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).