Sök…


Anmärkningar

Mönstermatchning är ett kraftfullt drag i många funktionella språk eftersom det ofta gör det möjligt att hantera grenning mycket kortfattat jämfört med att använda flera if / else if / else stiluttalanden. Men med tillräckligt med alternativ och "när" vakter , kan Pattern Matching också bli ordbok och svår att förstå på ett ögonkast.

När detta händer kan F #: s aktiva mönster vara ett bra sätt att ge meningsfulla namn på matchande logik, vilket förenklar koden och också möjliggör återanvändning.

Matchningsalternativ

Mönstermatchning kan vara användbart för att hantera Alternativ:

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

Mönstermatchning kontrollerar hela domänen

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

ger en varning

C: \ Programfiler (x86) \ Microsoft VS-kod \ Untitled-1 (2,7): varning FS0025: Ofullständigt mönster matchar på detta uttryck. Till exempel kan värdet "falskt" indikera ett fall som inte täcks av mönstret.

Detta beror på att inte alla möjliga boolvärden täcktes.

booler kan uttryckligen listas men ints är svårare att lista ut

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

här använder vi den speciella _ karaktären. _ Matchar alla andra möjliga fall.

_ Kan få dig till problem

överväga en typ vi skapar oss så det ser ut så här

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk

Vi kanske skriver en match med expession som ser ut så här

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

Ovanstående kod är vettig. Vi antar att om du inte är nykter bör du ringa en uber så vi använder _ att beteckna det

Senare refaktorerar vi vår kod till detta

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk
    | Unconscious

F # -kompilatorn bör ge oss en varning och uppmana oss att refaktorera vårt matchuttryck för att få personen att söka läkare. I stället behandlar matchuttrycket tyst den medvetslösa personen som om de bara var lustiga. Poängen är att du bör välja att uttryckligen lista upp fall när det är möjligt för att undvika logikfel.

Fall utvärderas från topp till botten och den första matchen används

Felaktig användning:

I följande utdrag kommer den sista matchen aldrig att användas:

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"

grafik

x är allt som inte anges ovan

Rätt användning:

Här kommer både x = 1 och x = 4 att träffa sina specifika fall, medan allt annat kommer att gå igenom till standardfallet _ :

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"

grafik

x är 4

När vakter låter dig lägga till godtyckliga villkor

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow