Tracks
/
F#
F#
/
Temario
/
Coincidencia de patrones
Co

Coincidencia de patrones en F#

1 ejercicio

Acerca de Coincidencia de patrones

Una expresión if/elif/else se puede usar para ejecutar lógica de forma condicional. F# también tiene otra forma más poderosa de ejecutar lógica de forma condicional: la coincidencia de patrones. Con la coincidencia de patrones, puedes probar un valor contra uno o más patrones. Un ejemplo de ese patrón es el patrón constante, que hace coincidir un valor con una constante (por ejemplo, 1 o "hello").

En F#, la coincidencia de patrones se hace con la palabra clave match:

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

Aunque esto puede parecerse a las sentencias switch de otros lenguajes, la coincidencia de patrones empieza a brillar cuando además usas otros patrones. Uno de esos patrones es el patrón de variable, que te permite capturar un valor:

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

En algunos casos, quizá quieras agregar una condición adicional a un patrón. Esto se conoce como guarda (cláusula), que se puede agregar con la palabra clave when:

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

Una cláusula de guarda puede ser cualquier expresión válida, lo que incluye llamar a funciones.

En el ejemplo anterior, no todos los argumentos posibles tendrán un patrón que coincida. El compilador lo detectará y mostrará una advertencia. Esto se conoce como coincidencia exhaustiva. Para resolver la advertencia, hay que manejar todos los casos. Para eso puedes usar el [patrón comodín][wildcard-pattern], que es un patrón que coincide con cualquier valor:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

Ten en cuenta que el compilador no puede usar las cláusulas when para inferir la exhaustividad:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

La coincidencia de patrones prueba un valor contra cada patrón de arriba a abajo, hasta que encuentra un patrón que coincide y ejecuta la lógica asociada a ese patrón. ¡El orden de los patrones importa! Por eso, el patrón de descarte siempre debe ser el último patrón de una expresión match.

Aunque la coincidencia de patrones es muy poderosa, la lógica condicional simple suele expresarse con más claridad usando una expresión if/else:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Coincidencia de patrones