Buscar..


Observaciones

La coincidencia de patrones es una característica poderosa de muchos lenguajes funcionales, ya que a menudo permite que las ramas se manejen de manera muy sucinta en comparación con el uso de múltiples declaraciones de estilo if / else if / else . Sin embargo, dadas las opciones suficientes y los guardias de "cuándo" , el ajuste de patrones también puede volverse detallado y difícil de entender de un vistazo.

Cuando esto sucede, los Patrones Activos de F # pueden ser una excelente manera de dar nombres significativos a la lógica coincidente, lo que simplifica el código y también permite la reutilización.

Opciones de juego

La coincidencia de patrones puede ser útil para manejar las opciones:

let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"

La coincidencia de patrones comprueba que todo el dominio está cubierto

let x = true
match x with
| true -> printfn "x is true"

produce una advertencia

C: \ Archivos de programa (x86) \ Microsoft VS Code \ Untitled-1 (2,7): warning FS0025: El patrón incompleto coincide con esta expresión. Por ejemplo, el valor 'falso' puede indicar un caso que no está cubierto por el patrón (s).

Esto se debe a que no se cubrieron todos los valores bools posibles.

Los bools se pueden enumerar explícitamente pero los ints son más difíciles de enumerar

let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"

Aquí usamos el carácter especial _ El _ coincide con todos los demás casos posibles.

El _ puede meterte en problemas

Consideremos un tipo que creamos nosotros mismos se ve así

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk

Podríamos escribir una coincidencia con la expesión que se ve así

match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"

El código anterior tiene sentido. Asumimos que si no está sobrio, debe llamar a un súper, así que usamos _ para indicar que

Más tarde refactorizamos nuestro código para esto.

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk
    | Unconscious

El compilador de F # debe darnos una advertencia y pedirnos que refactoricemos nuestra expresión de coincidencia para que la persona busque atención médica. En cambio, la expresión de coincidencia trata silenciosamente a la persona inconsciente como si solo estuviera borracha. El punto es que debe optar por listar explícitamente los casos cuando sea posible para evitar errores lógicos.

Los casos se evalúan de arriba a abajo y se usa la primera coincidencia.

Uso incorrecto:

En el siguiente fragmento de código, nunca se utilizará la última coincidencia:

let x = 4
match x with
| 1 -> printfn "x is 1"
| _ -> printfn "x is anything that wasn't listed above"
| 4 -> printfn "x is 4"

huellas dactilares

x es algo que no estaba en la lista de arriba

Uso Correcto:

Aquí, tanto x = 1 como x = 4 alcanzarán sus casos específicos, mientras que todo lo demás caerá en el caso predeterminado _ :

let x = 4
match x with
| 1 -> printfn "x is 1"
| 4 -> printfn "x is 4"
| _ -> printfn "x is anything that wasn't listed above"

huellas dactilares

x es 4

Cuando los guardias te permiten añadir condicionales arbitrarios.

type Person = {
    Age : int
    PassedDriversTest : bool }

let someone = { Age = 19; PassedDriversTest = true }

match someone.PassedDriversTest with
| true when someone.Age >= 16 -> printfn "congrats"
| true -> printfn "wait until you are 16"
| false -> printfn "you need to pass the test"


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow