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"