Trilhas
/
F#
F#
/
Programa
/
Casamento de padrões
Ca

Casamento de padrões em F#

1 exercício

Sobre Casamento de padrões

Uma expressão if/elif/else pode ser usada para executar lógica condicionalmente. O F# também tem outra forma, mais poderosa, de executar lógica condicionalmente: o casamento de padrões. Com o casamento de padrões, um valor pode ser testado em relação a um ou mais padrões. Um exemplo desses padrões é o padrão constante, que compara um valor com uma constante (por exemplo, 1 ou "hello").

No F#, o casamento de padrões é feito com a palavra-chave match:

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

Embora isso possa parecer com as instruções switch de outras linguagens, o casamento de padrões começa a brilhar quando você também usa outros padrões. Um desses padrões é o padrão variável, que permite capturar um valor:

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

Em alguns casos, você pode querer adicionar uma condição extra a um padrão. Isso é conhecido como guarda (cláusula), que pode ser adicionada com a palavra-chave when:

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

Uma cláusula de guarda pode ser qualquer expressão válida, o que inclui chamar funções.

No exemplo acima, nem toda entrada possível terá um padrão correspondente. O compilador vai detectar isso e emitir um aviso. Isso é conhecido como casamento exaustivo. Para resolver o aviso, é preciso tratar todos os casos. Para isso, pode-se usar o [padrão curinga][wildcard-pattern], que é um padrão que casa com qualquer valor:

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

// No compiler warning

Repare que o compilador não consegue usar cláusulas when para inferir a exaustividade:

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

// Compiler warning

O casamento de padrões testa um valor em relação a cada padrão, de cima para baixo, até encontrar um padrão correspondente e executar a lógica associada a ele. A ordem dos padrões importa! Por isso, o padrão de descarte deve ser sempre o último padrão de uma expressão match.

Embora o casamento de padrões seja muito poderoso, uma lógica condicional simples geralmente fica mais clara com uma expressão if/else:

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

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Casamento de padrões