Expresiones match (F#)
La expresión match proporciona control de bifurcación basado en la comparación de una expresión con un conjunto de modelos.
// Match expression.
match test-expression with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ] -> result-expression2
| ...
// Pattern matching function.
function
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ] -> result-expression2
| ...
Comentarios
Las expresiones de coincidencia de modelos permiten bifurcaciones complejas basadas en la comparación de una expresión de prueba con un conjunto de modelos. En la expresión match, se compara test-expression con cada modelo y, cuando se encuentra una coincidencia, se evalúa la expresión result-expression correspondiente y se devuelve el valor resultante como valor de la expresión match.
La función de coincidencia de modelos mostrada en la sintaxis anterior es una expresión lambda donde la coincidencia de modelos se realiza inmediatamente con el argumento. La función de coincidencia de modelos mostrada en la sintaxis anterior es equivalente a lo que se muestra a continuación.
fun arg ->
match arg with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ]-> result-expression2
| ...
Para obtener más información sobre las expresiones lambda, vea Expresiones lambda: la palabra clave fun (F#).
El conjunto de modelos debe cubrir todas las posibles coincidencias de la variable de entrada. Con frecuencia, se utiliza el carácter comodín (_) como último modelo para buscar coincidencias con los valores de entrada que no coincidan con los modelos anteriores.
En el código siguiente, se muestran algunas de las formas de usar la expresión match. Para obtener una referencia y ejemplos de todos los posibles modelos que se pueden utilizar, vea Coincidencia de modelos [F#].
let list1 = [ 1; 5; 100; 450; 788 ]
// Pattern matching by using the cons pattern and a list
// pattern that tests for an empty list.
let rec printList listx =
match listx with
| head :: tail -> printf "%d " head; printList tail
| [] -> printfn ""
printList list1
// Pattern matching with multiple alternatives on the same line.
let filter123 x =
match x with
| 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
| a -> printfn "%d" a
// The same function written with the pattern matching
// function syntax.
let filterNumbers =
function | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
| a -> printfn "%d" a
Restricciones en los modelos
Se puede utilizar una cláusula when para especificar una condición adicional que la variable debe cumplir para que coincida con un modelo. Este tipo de cláusula se conoce como protección. No se evalúa la expresión que aparece después de la palabra clave when, a menos que se encuentre una coincidencia con el modelo asociado a esa protección.
En el ejemplo siguiente se muestra el uso de una protección para especificar un intervalo numérico de un modelo de variable. Observe que se combinan varias condiciones mediante operadores booleanos.
let rangeTest testValue mid size =
match testValue with
| var1 when var1 >= mid - size/2 && var1 <= mid + size/2 -> printfn "The test value is in range."
| _ -> printfn "The test value is out of range."
rangeTest 10 20 5
rangeTest 10 20 10
rangeTest 10 20 40
Tenga en cuenta que, como no se pueden usar valores distintos de literales en el modelo, se debe usar una cláusula when si hay que comparar parte de la entrada con un valor. Esto se muestra en el código siguiente.
// This example uses patterns that have when guards.
let detectValue point target =
match point with
| (a, b) when a = target && b = target -> printfn "Both values match target %d." target
| (a, b) when a = target -> printfn "First value matched target in (%d, %d)" target b
| (a, b) when b = target -> printfn "Second value matched target in (%d, %d)" a target
| _ -> printfn "Neither value matches target."
detectValue (0, 0) 0
detectValue (1, 0) 0
detectValue (0, 10) 0
detectValue (10, 15) 0