F#
Dopasowywanie wzorów
Szukaj…
Uwagi
Dopasowywanie wzorców jest potężną cechą wielu języków funkcjonalnych, ponieważ często pozwala na bardzo zwięzłe obsługiwanie rozgałęzień w porównaniu do używania wielu instrukcji stylu if
/ else if
/ else
. Jednak biorąc pod uwagę wystarczającą liczbę opcji i ochronę „kiedy” , dopasowanie wzoru może również stać się pełne i trudne do zrozumienia na pierwszy rzut oka.
Kiedy tak się dzieje, aktywne wzorce F # mogą być świetnym sposobem na nadanie znaczących nazw pasującej logice, co upraszcza kod, a także umożliwia ponowne użycie.
Dopasowane opcje
Dopasowywanie wzorców może być przydatne do obsługi opcji:
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
Dopasowanie wzorca sprawdza, czy obejmuje całą domenę
let x = true
match x with
| true -> printfn "x is true"
daje ostrzeżenie
C: \ Program Files (x86) \ Microsoft VS Code \ Untitled-1 (2,7): ostrzeżenie FS0025: Niepełne dopasowanie wzorca dla tego wyrażenia. Na przykład wartość „fałsz” może wskazywać przypadek nieobjęty wzorcem (wzorami).
Jest tak, ponieważ nie wszystkie możliwe wartości bool zostały uwzględnione.
boole mogą być wyraźnie wymienione, ale ints trudniej jest wymienić
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
tutaj używamy znaku specjalnego _
. _
Pasuje do wszystkich innych możliwych przypadków.
_
Może wpędzić cię w kłopoty
rozważmy typ, który sami tworzymy, tak to wygląda
type Sobriety =
| Sober
| Tipsy
| Drunk
Możemy napisać mecz z taką właśnie ekspozycją
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
Powyższy kod ma sens. Zakładamy, że jeśli nie jesteś trzeźwy, powinieneś zadzwonić do użytkownika Uber, więc używamy _
aby to zaznaczyć
Później zmieniliśmy kod na ten kod
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
Kompilator F # powinien dać nam ostrzeżenie i skłonić nas do zmiany wyrażenia dopasowania, aby osoba ta szukała pomocy medycznej. Zamiast tego wyrażenie dopasowania po cichu traktuje nieprzytomną osobę, jakby była tylko podenerwowana. Chodzi o to, że powinieneś zdecydować się jawnie wypisać przypadki, jeśli to możliwe, aby uniknąć błędów logicznych.
Przypadki są oceniane od góry do dołu i używane jest pierwsze dopasowanie
Niepoprawne użycie:
W poniższym fragmencie nigdy nie zostanie użyte ostatnie dopasowanie:
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"
odciski
x jest wszystkim, czego nie wymieniono powyżej
Prawidłowa obsługa:
Tutaj zarówno x = 1
i x = 4
trafią w swoje konkretne przypadki, podczas gdy wszystko inne spadnie do przypadku domyślnego _
:
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"
odciski
x wynosi 4
Gdy strażnicy pozwalają dodawać dowolne warunki warunkowe
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"