Corresponder expressões (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 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 ->
corresponder arg com
| pattern1 quandocondition ] -> result-expression1
| pattern2quandocondition ]-> result-expression2
| ...
Para obter mais informações sobre expressões lambda, consulte Expressões lambda: A diversão de palavra-chave (F#).
Todo o conjunto de padrões deve cobrir todos os possíveis corresponde a variável de entrada. Com freqüência, use o padrão de caractere curinga (_) como o último padrão para corresponder a quaisquer valores de entrada anteriormente incomparáveis.
O código a seguir ilustra algumas das maneiras em que o match a expressão é usada. Para obter 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 ao padrão. Como uma cláusula é conhecida como um guard. A seguinte expressão de when palavra-chave não será avaliado, 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ê tem que comparar alguma parte da entrada em relação a um valor. 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