Kurzusok
/
F#
F#
/
Feladatok
/
Valentin-nap
Valentin-nap

Valentin-nap

Tanulófeladat

Bevezetés

Diszkriminált uniók

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"

Utasítások

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

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

Hat feladat áll rendelkezésedre, hogy segítsenek kiválasztani a Valentin-napi tevékenységeteket.

1. A jóváhagyás meghatározása

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.

2. A konyhák meghatározása

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.

3. A filmműfajok meghatározása

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.

4. A tevékenység meghatározása

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.

5. A tevékenység értékelése

Végre készen állsz, hogy értékeld a párod ötleteit. Így érzel 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.
  • Étterembe menés: igen, ha a konyha koreai, talán, ha török.
  • Séta: igen, ha a séta kevesebb mint három kilométer; talán, ha kevesebb mint öt kilométer; egyébként nem.

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

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

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.