Espressioni match (F#)
L'espressione match offre il controllo sulla creazione di rami basato sul confronto di un'espressione con un set di modelli.
// 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
| ...
Note
Le espressioni di corrispondenza dei modelli consentono la creazione complessa di rami, basata sul confronto di un'espressione di test con un set di modelli.Nell'espressione match l'oggetto test-expression viene confrontato con ogni modello e quando viene trovata una corrispondenza, l'oggetto result-expression corrispondente viene valutato e il valore risultante viene restituito come valore dell'espressione di corrispondenza.
La funzione di corrispondenza dei modelli illustrata nella sintassi precedente è un'espressione lambda in cui la ricerca della corrispondenza viene eseguita immediatamente nell'argomento.La funzione di corrispondenza dei modelli illustrata nella sintassi precedente equivale a quanto indicato di seguito.
fun arg ->
match arg with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ]-> result-expression2
| ...
Per ulteriori informazioni sulle espressioni lambda, vedere Espressioni lambda: parola chiave fun (F#).
L'intero set di modelli deve coprire tutte le possibili corrispondenze della variabile di input.Spesso viene utilizzato il modello carattere jolly (_) come ultimo modello, per trovare la corrispondenza con i valori di input per i quali non è stata trovata in precedenza.
Nel codice seguente vengono illustrate alcune modalità di utilizzo dell'espressione match.Per un riferimento ed esempi di tutti i possibili modelli che è possibile utilizzare, vedere Criteri di ricerca [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
Guard nei modelli
È possibile utilizzare una clausola when per specificare una condizione aggiuntiva che la variabile deve soddisfare affinché venga trovata la corrispondenza con un modello.Tale clausola è detta guard.L'espressione che segue la parola chiave when non viene valutata, a meno che non venga trovata una corrispondenza con il modello associato a tale guard.
Nell'esempio seguente viene illustrato l'utilizzo di un elemento guard per specificare un intervallo numerico per un modello variabile.Si noti che più condizioni vengono combinate utilizzando operatori booleani.
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
Si noti che, poiché nel modello non è possibile utilizzare valori diversi dai valori letterali, è necessario utilizzare una clausola when se si deve confrontare una parte dell'input con un valore.come illustrato nel codice che segue.
// 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