A diszkriminált unió típus névvel ellátott esetek egy rögzített halmazát reprezentálja. A diszkriminált unió minden értéke pontosan az egyik névvel ellátott esetnek felel meg.
A diszkriminált uniót a type kulcsszóval definiálod, az eseteket pedig függőleges vonal (|) karakterek választják el egymástól:
type Season =
| Spring
| Summer
| Autumn
| Winter
A diszkriminált unió minden esetéhez opcionálisan kapcsolódhat adat, és a különböző esetekhez különböző típusú adat tartozhat. Ha egyik esethez sem kapcsolódik adat, a diszkriminált unió ahhoz hasonló, amit más nyelvek általában felsorolásnak (vagy enum-nak) neveznek.
type Number =
| Integer of int
| Float of float
| Invalid
Egy adott esethez tartozó értéket úgy hozhatsz létre, hogy a nevére hivatkozol (például Success). Mivel az esetnevek csupán konstruktorfüggvények, a kapcsolódó adatot hagyományos függvényargumentumként adhatod át. Ha egy másik diszkriminált unió már definiált egy ugyanilyen nevű esetet, a teljes nevét kell használnod (például Result.Success).
let byName = Integer 2
let byFullName = Number.Invalid
A diszkriminált uniók strukturális egyenlőséggel rendelkeznek, ami azt jelenti, hogy két érték, amely ugyanahhoz az esethez tartozik és ugyanazzal az (opcionális) adattal rendelkezik, egyenértékű.
Bár a diszkriminált uniókkal if/elif/else kifejezésekkel is dolgozhatsz, a velük való munka ajánlott módja a mintaillesztés, méghozzá az azonosító minta használatával:
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"
Ebben a feladatban Valentin-nap van, te és a párod pedig valami szép közös programot terveztek. A párodnak rengeteg ötlete van, és most megkér, hogy értékeld ezeket az ötleteket, hogy megtaláljátok a közös tevékenységet.
A párod a következő ötletekkel állt elő:
Hat feladat áll rendelkezésedre, hogy segítsenek kiválasztani a Valentin-napi tevékenységeteket.
A párod minden ötletére három lehetőség egyikével válaszolsz: igen, nem vagy talán.
Definiáld az Approval diszkriminált uniót, amely ezeket a lehetőségeket a következő három esettel reprezentálja: Yes, No és Maybe.
A párod két lehetséges éttermet választott: az egyik a koreai konyhára épül, a másik a török konyhára.
Definiáld a Cuisine diszkriminált uniót, amely ezeket a konyhákat a következő két esettel reprezentálja: Korean és Turkish.
Rengeteg film közül lehet választani, ezért hogy szűkítsétek a kört, a párod a műfajukat is felsorolja.
Definiáld a Genre diszkriminált uniót, amely a következő műfajokat reprezentálja esetként: Crime, Horror, Romance és Thriller.
Ahogy már említettük, a párod öt különböző tevékenységet talált ki: társasjátékozás, kikapcsolódás, filmnézés, étterembe menés és séta.
Definiáld az Activity diszkriminált uniót, amely ezeket a tevékenységtípusokat reprezentálja:
BoardGame: nincs társított adata.Chill: nincs társított adata.Movie: Genre típusú társított adata van.Restaurant: Cuisine típusú társított adata van.Walk: egy int típusú társított adata van, amely a megtett kilométerek számát reprezentálja.Végre készen állsz, hogy értékeld a párod ötleteit. Így érzel a párod ötleteiről:
Valósítsd meg a rateActivity nevű függvényt, amely egy Activity értéket vesz át, és a fenti érzelmek alapján visszaadja az Approval értéket:
rateActivity (Restaurant Turkish)
// => Maybe
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.