Kurzusok
/
F#
F#
/
Tanterv
/
Mintailesztés
Mi

Mintailesztés ebben a kurzusban: F#

1 feladat

A(z) Mintailesztés fogalomról

Egy if/elif/else kifejezéssel feltételesen hajthatsz végre logikát. Az F#-nak azonban van egy másik, hatékonyabb módja is erre: a mintaillesztés. A mintaillesztéssel egy értéket egy vagy több mintával tudsz összevetni. Ilyen minta például a konstansminta, amely egy értéket egy konstanssal vet össze (például 1 vagy "hello").

Az F#-ban a mintaillesztés a match kulcsszóval történik:

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

Bár ez más nyelvek switch utasításaira hasonlít, a mintaillesztés igazán akkor mutatja meg az erejét, ha más mintákat is használsz. Ilyen minta például a változóminta, amellyel egy értéket rögzíthetsz:

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

Bizonyos esetekben további feltételt szeretnél hozzáadni egy mintához. Ezt őrfeltételnek (guard ág) nevezik, és a when kulcsszóval adhatod hozzá:

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

Az őrfeltétel bármilyen érvényes kifejezés lehet, akár függvényhívás is.

A fenti példában nem minden lehetséges bemenethez tartozik illeszkedő minta. A fordító észleli ezt, és figyelmeztetést ír ki. Ezt kimerítő illesztésnek nevezik. A figyelmeztetés megszüntetéséhez minden esetet le kell kezelni. Erre a [helyettesítő mintát][wildcard-pattern] használhatod, amely bármilyen értékre illeszkedik:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

Ne feledd, hogy a fordító a when feltételekből nem tudja megállapítani, hogy az illesztés kimerítő-e:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

A mintaillesztés fentről lefelé haladva veti össze az értéket az egyes mintákkal, amíg nem talál egy illeszkedő mintát, és végre nem hajtja a hozzá tartozó logikát. A minták sorrendje számít! Ezért a helyettesítő mintának mindig az utolsónak kell lennie egy match kifejezésben.

Bár a mintaillesztés nagyon hatékony, az egyszerű feltételes logikát általában világosabban fejezheted ki if/else kifejezéssel:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Mintailesztés fogalmat