Kurzusok
/
Haskell
Haskell
/
Feladatok
/
Valentin-nap
Valentin-nap

Valentin-nap

Tanulófeladat

Bevezetés

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"

Utasítások

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ő:

  • Társasjátékozás
  • Kikapcsolódás
  • Filmnézés
  • Étteremlátogatás
  • Séta

Hat részfeladat segít kiválasztani a Valentin-napi tevékenységet.

1. Definiáld a jóváhagyást

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.

2. Definiáld a konyhákat

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.

3. Definiáld a filmes műfajokat

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.

4. Definiáld a tevékenységet

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.

5. Értékeld a tevékenységet

Végül készen állsz arra, hogy értékeld a párod ötleteit. Így vélekedsz a párod ötleteiről:

  • Társasjátékozás: nem.
  • Kikapcsolódás: nem.
  • Filmnézés: igen, ha romantikus film; egyébként nem.
  • Étteremlátogatás: igen, ha koreai a konyha, talán, ha török.
  • Séta: igen, ha kevesebb mint három kilométer; talán, ha három és öt kilométer között van (a végpontokat is beleértve); egyébként nem.

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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Haskell Exercism

Készen állsz elkezdeni a(z) Valentin-nap feladatot?

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.