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 a feltételes végrehajtásra: a mintaillesztés. A mintaillesztés során egy értéket egy vagy több mintával vethetsz össze. Ilyen minta például a konstans minta, amely egy értéket egy konstanshoz hasonlít (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íthat, a mintaillesztés akkor mutatja meg igazán az erejét, amikor más mintákat is használsz. Ilyen 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 adni egy mintához. Ezt őrszemnek (feltételnek) nevezik, és a when kulcsszóval adhatod hozzá:
match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"
A fenti példában nem minden lehetséges bemenethez tartozik illeszkedő minta. A fordító ezt észleli, és figyelmeztetést ír ki. Ezt kimerítő ellenőrzésnek nevezik. A figyelmeztetés megoldásához minden esetet kezelned kell. Erre a wildcard minta használható, amely bármilyen értékre illeszkedik:
match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"
// No compiler warning
A mintaillesztés egy értéket fentről lefelé haladva vet össze minden mintával, 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!
Ebben a feladatban egy barátoddal játszol számkitalálós játékot. A szabályok egyszerűek: titokban választasz egy számot 1 és 100 között, a barátod pedig megpróbálja kitalálni, hogy melyik számot választottad. Hogy segíts a barátodnak, más-más választ adsz attól függően, hogy milyen közel járt a tipp a választott számhoz (42). A különböző válaszok szabályai a következők:
42: "Correct"41 vagy 43: "So close"41: "Too low"43: "Too high"Négy részfeladat vár rád, hogy kódold a tippekre adott válaszokat.
Valósítsd meg a reply függvényt, hogy válaszoljon egy helyes tippre:
reply 42
// => "Correct"
Alakítsd át a reply függvényt, hogy válaszoljon a közeli tippekre:
reply 41
// => "So close"
Alakítsd át a reply függvényt, hogy válaszoljon a túl alacsony tippekre:
reply 25
// => "Too low"
Alakítsd át a reply függvényt, hogy válaszoljon a túl magas tippekre:
reply 88
// => "Too high"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) F# nyelvet 18 fogalom148 feladat segítségével, valódi emberi mentorálással, mindez ingyen.