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"


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow