Zoeken…


Opmerkingen

Patroonovereenkomst is een krachtige functie van veel functionele talen, omdat vertakkingen vaak zeer bondig kunnen worden afgehandeld in vergelijking met het gebruik van meerdere if / else if / else stijlinstructies. Echter, gegeven voldoende opties en "wanneer" bewakers , kan Pattern Matching ook uitgebreid en moeilijk te begrijpen zijn in één oogopslag.

Wanneer dit gebeurt, kunnen de actieve patronen van F # een geweldige manier zijn om de overeenkomende logica betekenisvolle namen te geven, wat de code vereenvoudigt en ook hergebruik mogelijk maakt.

Bijpassende opties

Patroonafstemming kan handig zijn om opties te verwerken:

let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"

Patroonmatching controleert of het hele domein is bedekt

let x = true
match x with
| true -> printfn "x is true"

geeft een waarschuwing

C: \ Program Files (x86) \ Microsoft VS Code \ Untitled-1 (2,7): waarschuwing FS0025: onvolledige patroonovereenkomsten voor deze uitdrukking. De waarde 'false' kan bijvoorbeeld een geval aangeven dat niet door het patroon of de patronen wordt gedekt.

Dit komt omdat niet alle mogelijke Bool-waarden zijn gedekt.

Bools kunnen expliciet worden vermeld, maar ints zijn moeilijker te vermelden

let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"

hier gebruiken we het speciale _ -teken. De _ overeen met alle andere mogelijke gevallen.

De _ kan je in de problemen brengen

overweeg een type dat we zelf maken, het ziet er zo uit

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk

We kunnen een match met expession schrijven die er zo uitziet

match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"

Bovenstaande code is logisch. We nemen aan dat als je niet nuchter bent, je een uber moet bellen, dus gebruiken we de _ om dat aan te duiden

Later zullen we onze code hierop aanpassen

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk
    | Unconscious

De F # -compiler zou ons een waarschuwing moeten geven en ons moeten aansporen onze wedstrijduitdrukking te wijzigen om de persoon medische hulp te laten zoeken. In plaats daarvan behandelt de wedstrijduitdrukking de onbewuste persoon stilletjes alsof ze alleen aangeschoten waren. Het punt is dat u ervoor moet kiezen om gevallen waar mogelijk expliciet te vermelden om logische fouten te voorkomen.

Cases worden van boven naar beneden geëvalueerd en de eerste match wordt gebruikt

Onjuist gebruik:

In het volgende fragment wordt de laatste wedstrijd nooit gebruikt:

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"

prints

x is alles dat hierboven niet werd vermeld

Correct gebruik:

Hier zullen zowel x = 1 als x = 4 hun specifieke gevallen raken, terwijl al het andere doorvalt naar de standaardzaak _ :

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"

prints

x is 4

Wanneer bewakers je willekeurige conditionals laten toevoegen

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow