Hogyan lehetne kivitelezni ezt a feladatot? (Haskell)
Ami konkrétan nem megy benne az az, hogy hogyan lehet Haskell-ben két számot függvényben összehasonlítani
Egy játékbolt kiárusítást tart a következő módon: azokat a játékokat, amelyekből 10-nél kevesebb van a készleten és az áruk nagyobb, mint 500 20%-kal leárazzák. A játékok nevét, árát és darabszámát egy (név, ár, db) formájú (Fractional a, Ord a, Integral b) => (String, a, b) rendezett hármas fogja reprezentálni.
Írj egy toysOnSale függvényt, amely egy listában visszaadja a leárazott játékokat árukkal együtt és a darabszám nélkül!
Az alábbi tesztesetek közül mindegyiknek True-t kell adnia:
toysOnSale [("labda",200.0, 5),("Barbie", 800.0, 15),
("Kisauto", 600.0, 9)] == [("Kisauto",480.0)]
toysOnSale [("Zold kisauto", 500, 1), ("Piros kisauto", 501, 1)]
== [("Piros kisauto",400.8)]
toysOnSale [("Zold kisauto", 1000, 9),
("Piros kisauto", 1000, 10)] == [("Zold kisauto",800.0)]
toysOnSale [] == []
A feladat az alábbi témaköröket fedi le:
- filter függvény,
- lambda-jelölés
- lambda-jelölés adattípusokra (jelen esetben rendezett n-esekre).
Például ha egy listában testhőmérsékletek vannak, akkor
filter (\temperature -> temperature > 37) [36, 36.7, 36.9, 38, 37.9, 36.3]
adja a lázas hőmérsékletek listáját:
[38.0, 37.9]
Ha a listában összetett adatszerkezetek vannak, vagyis itt rendezett hármasok, akkor a lambda-kifejezést meg lehet írni közvetlenül is ilyen mintaillesztéses alakban:
Például, ha a listában betegek szerepelnek névvel és testhőmérséklettel, akkor
filter (\(name, temperature) -> temperature > 37) [("Joe", 36), ("Eve", 36.7), ("Xenia", 36.9), ("Pete", 38), ("Lily", 37.9), ("Lucy", 36.3)]
megmutatja a lázas betegeket (teljes rekordjaikkal), itt jelen esetben
[("Pete", 38.0), ("Lily", 37.9)]
Ősszetett feltétetek is fölépíthetőek a filter lambda-kifejezésében:
filter (\(name, age, temperature) -> temperature > 37 && age < 30) [("Joe", 15, 36), ("Eve", 40, 36.7), ("Xenia", 5, 36.9), ("Pete", 22, 38), ("Lily", 55, 37.9), ("Lucy", 73, 36.3)]
ez például a lázas fiatalok adatait szűri le, íme az eredemény:
[("Pete", 22, 38.0)]
Majd ha a szűrés megvan jól, akkor a feladat része még az is, hogy az eredmény a megfelelő alakú legyen (vagyis itt jelen esetben az, hogy csak az első két adat szerepeljen).
Listaelemek elemenként való átalakítására a map függvény alkalmas.
A map függvény is magaabbrendű függvény, vagyis a lambda-kifejezések itt is jól hasznosíthatóak.
Például:
map (\(name, age, temperature) -> (age, temperature)) [("Joe", 15, 36), ("Eve", 40, 36.7), ("Xenia", 5, 36.9), ("Pete", 22, 38), ("Lily", 55, 37.9), ("Lucy", 73, 36.3)]
ez anonimizálja a betegadatokat (vagyis lehagyja a nevet):
[(15, 36.0), (40, 36.7), (5, 36.9), (22, 38.0), (55, 37.9), (73, 36.3)]
A minták, mintaillesztések esetében a ,,nem használt'' paraméternevek ,,jokerezhetőek'':
map (\(_, age, temperature) -> (age, temperature)) [("Joe", 15, 36), ("Eve", 40, 36.7), ("Xenia", 5, 36.9), ("Pete", 22, 38), ("Lily", 55, 37.9), ("Lucy", 73, 36.3)]
itt a name lett kijokerezve, hiszen nincs kihasználva, ezért elég a name helyett _ jelet írni
Vagyis a feladatnál lesz egy összetett filter, hogy szűrjön árra és darabszámra
és lesz egy szintén összetett map, amely két fajta átalakítást csinál: leszállítja az árat és elhagyja a darabszámot
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!