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"


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow