Ricerca…
Osservazioni
Pattern Matching è una potente funzionalità di molti linguaggi funzionali in quanto spesso consente di gestire la ramificazione in modo molto succinto rispetto all'utilizzo di più istruzioni di stile if
/ else if
/ else
. Tuttavia, date abbastanza opzioni e "quando" le guardie , Pattern Matching può anche diventare prolisso e difficile da capire a colpo d'occhio.
Quando ciò accade, i pattern attivi di F # possono essere un ottimo modo per dare nomi significativi alla logica di matching, che semplifica il codice e consente anche il riutilizzo.
Opzioni di corrispondenza
La corrispondenza del modello può essere utile per gestire le opzioni:
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
La corrispondenza del modello verifica che l'intero dominio sia coperto
let x = true
match x with
| true -> printfn "x is true"
produce un avvertimento
C: \ Programmi (x86) \ Microsoft VS Code \ Untitled-1 (2,7): avviso FS0025: corrispondenze di pattern incomplete su questa espressione. Ad esempio, il valore 'false' può indicare un caso non coperto dal / i motivo / i.
Questo perché non tutti i possibili valori bool erano coperti.
i bool possono essere elencati esplicitamente ma gli ints sono più difficili da elencare
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
qui usiamo il carattere _
speciale. Il _
corrisponde a tutti gli altri casi possibili.
Il _
può metterti nei guai
considera un tipo che creiamo noi stessi assomiglia a questo
type Sobriety =
| Sober
| Tipsy
| Drunk
Potremmo scrivere una corrispondenza con expession che assomiglia a questo
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
Il codice sopra ha un senso. Assumiamo che se non sei sobrio dovresti chiamare un uber, quindi usiamo il _
per denotarlo
In seguito ci rifattiamo il codice su questo
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
Il compilatore F # dovrebbe darci un avvertimento e chiederci di refactoring la nostra espressione di corrispondenza per avere la persona di cercare cure mediche. Invece l'espressione della corrispondenza tratta silenziosamente la persona incosciente come se fossero solo alticcia. Il punto è che dovresti scegliere di elencare esplicitamente i casi quando possibile per evitare errori logici.
I casi vengono valutati dall'alto verso il basso e viene utilizzata la prima corrispondenza
Utilizzo errato:
Nel seguente frammento, l'ultima partita non verrà mai utilizzata:
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"
stampe
x è tutto ciò che non era elencato sopra
Uso corretto:
Qui, sia x = 1
che x = 4
colpiranno i loro casi specifici, mentre tutto il resto passerà al caso predefinito _
:
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"
stampe
x è 4
Quando le guardie ti permettono di aggiungere condizionali arbitrari
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"