Compartilhar via


Expressões de correspondência (F#)

O match expressão fornece controle de ramificação que se baseia a comparação de uma expressão com um conjunto de padrões.

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

Comentários

As expressões de correspondência de padrão permitem a ramificação complexas baseadas na comparação de uma expressão de teste com um conjunto de padrões.No match a expressão, o test-expression é comparado com cada padrão, por sua vez, e quando uma correspondência for encontrada, o correspondente result-expression é avaliada e o valor resultante é retornado como o valor da expressão de correspondência.

A função mostrada na sintaxe anterior de correspondência de padrão é uma expressão lambda em qual padrão de correspondência é realizada imediatamente no argumento.A função mostrada na sintaxe anterior de correspondência de padrão é equivalente à seguinte.

fun arg ->

corresponde ao arg com

| pattern1 whencondition -> result-expression1

| pattern2 whencondition-> result-expression2

| ...

Para obter mais informações sobre expressões lambda, consulte As expressões lambda: Diversão palavra-chave (F#).

Todo o conjunto de padrões deve cobrir todos os possíveis corresponde da variável de entrada.Com freqüência, você usa o padrão de caractere curinga (_) como o último padrão para coincidir com qualquer anteriormente incomparáveis valores de entrada.

O código a seguir ilustra algumas das maneiras como o match a expressão é usada.Para uma referência e exemplos de todos os padrões possíveis que podem ser usados, consulte Padrões correspondentes (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

Guardas de padrões

Você pode usar um when cláusula para especificar uma condição adicional que a variável deve satisfazer para corresponder a um padrão.Tal uma cláusula é conhecida como um de proteção.A seguinte expressão de when palavra-chave não será avaliada, a menos que uma correspondência é feita no padrão associado a esse protetor.

O exemplo a seguir ilustra o uso de um protetor para especificar um intervalo numérico para um padrão de variável.Observe que várias condições são combinadas usando 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

Observe que como valores diferentes de literais não podem ser usados no padrão, você deve usar um when cláusula se você tiver alguma parte da entrada em relação a um valor de comparar.Isto é mostrado no código a seguir.

// 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

Consulte também

Referência

Padrões de ativos (F#)

Outros recursos

Referência de linguagem do F#