Az algebrai adattípus (ADT) névvel ellátott esetek rögzített számát képviseli. Az ADT minden értéke pontosan az egyik névvel ellátott esetnek felel meg.
Az ADT-t a data kulcsszóval definiálod, az eseteket függőleges vonal (|) karakterekkel elválasztva.
Ha egyik esethez sem tartozik adat, az ADT hasonló ahhoz, amit más nyelvekben általában felsorolásnak (vagy enumnak) neveznek.
data Season
= Spring
| Summer
| Autumn
| Winter
Egy ADT minden esetéhez tartozhat opcionálisan adat, és a különböző esetekhez különböző típusú adat tartozhat. Ha az esethez adat tartozik, konstruktorra van szükség.
data Number
= NInt Int --'NInt' is the constructor for an Int Number.
| NFloat Float --'NFloat' is the constructor for an Float Number.
| Invalid --'Invalid' does not have data associated to it.
Egy adott esethez tartozó értéket úgy hozhatsz létre, hogy a nevére hivatkozol (például NInt 22).
Mivel az esetnevek csupán konstruktorfüggvények, a hozzájuk tartozó adatot szokásos függvényargumentumként adhatod át.
Az ADT-knek strukturális egyenlőségük van, ami azt jelenti, hogy két érték, amely ugyanahhoz az esethez tartozik, és ugyanaz az (opcionális) adatuk, egyenértékű.
Bár az ADT-kkel dolgozhatsz if/else kifejezésekkel is, a velük való munka ajánlott módja a mintaillesztés a case utasítással:
add1 :: Number -> String
add1 number =
case number of
NInt i -> show (i + 1)
NFloat f -> show (f + 1.0)
Invalid -> error "Invalid input"
Ebben a feladatban Valentin-nap van, és azon gondolkodsz, mit csinálj a pároddal. A párodnak rengeteg ötlete van, és arra kér, hogy értékeld őket, hogy megtaláljátok a legjobb tevékenységet.
A párod a következő ötletekkel állt elő:
Hat részfeladat segít kiválasztani a Valentin-napi tevékenységet.
A párod minden ötletére három lehetőség egyikével válaszolsz: igen, nem vagy talán.
Definiáld az Approval algebrai adattípust, amely ezeket a lehetőségeket a következő három esettel reprezentálja: Yes, No vagy Maybe.
A párod két lehetséges éttermet választott ki: az egyik koreai, a másik török konyhára épül.
Definiáld a Cuisine algebrai adattípust, amely ezeket az éttermeket a következő két esettel reprezentálja: Korean vagy Turkish.
Mivel rengeteg film közül lehet választani, a párod megadja a kedvenc műfaját is, hogy szűkítse a kört.
Definiáld a Genre algebrai adattípust, amely a következő műfajokat reprezentálja: Crime, Horror, Romance vagy Thriller.
Ahogy már említettük, a párod öt lehetséges tevékenységet talált ki: társasjátékozás, kikapcsolódás, filmnézés, étteremlátogatás és séta.
Definiáld az Activity algebrai adattípust, amely ezeket a tevékenységtípusokat reprezentálja:
BoardGame: nincs hozzá tartozó adat.Chill: nincs hozzá tartozó adat.Movie: hozzá tartozó adata a Genre.Restaurant: hozzá tartozó adata a Cuisine.Walk: hozzá tartozó adatként egy Int, amely a megtett kilométerek számát adja meg.Végül készen állsz arra, hogy értékeld a párod ötleteit. Így vélekedsz a párod ötleteiről:
Készíts egy rateActivity nevű függvényt, amely egy Activity értéket vesz át, és a fentiek alapján visszaadja az Approval értéket.
Például:
rateActivity (Restaurant Turkish)
-- -> Maybe
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Haskell nyelvet 107 feladat segítségével, valódi emberi mentorálással, mindez ingyen.