Prioritásos sor

Általános tudnivalók

Használható segédanyagok: GHC dokumentáció, Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármi kérdés, észrevétel felmerül, azt a felügyelőnek jelezzétek, NE a mellettetek ülőnek!

A feladatok egymásra épülnek ezért érdemes ezeket a megadásuk sorrendjében megoldani, de legalább megérteni az aktuális feladatot megelőző feladatokat!

Tekintve, hogy a tesztesetek, bár odafigyelés mellett íródnak, nem fedik le minden esetben a függvény teljes működését, határozottan javasolt még külön próbálgatni a megoldásokat beadás előtt, vagy megkérdezni a felügyelőket!

Részpontszámokat csak az elégséges szint elérése után lehet kapni!

A feladat összefoglaló leírása

A feladat megoldása során a prioritásos sor adatszerkezetet és a hozzá tartozó műveletek halmazát fogjuk megvalósítani. A prioritásos sort valójában egy lista segítségével fogjuk megadni, amely mindig prioritás és azon belül is beérkezési sorrendben tárolja a bejegyzéseket. Hogy megkülönböztessük egy hagyományos rendezett párokból álló listától, egy saját típust hozunk neki létre.

A prioritást egész számként adjuk meg:

type Priority = Int

Továbbá az Entry algebrai adattípus a prioritásos sor elemeit írja le:

data Entry a = Entry Priority a
  deriving (Eq, Show, Data, Typeable)

Végül magát a prioritásos sort a PQueue típus foglalja össze:

data PQueue a = PQueue [Entry a]
  deriving (Eq, Show, Data, Typeable)

Elem létrehozása (1 pont)

Készítsünk egy olyan függvényt, amellyel a prioritásos sorba beillesztendő elemeket tudunk előállítani!

(@@) :: a -> Priority -> Entry a

Test>
Entry 2 "verd" :: Entry [Char]
Test>
Entry 8 "rouge" :: Entry [Char]
Test>
Entry 3 "blanc" :: Entry [Char]

Elem értéke (1 pont)

Adjuk meg azt a függvényt, amely a paraméterül kapott Entry típusú paraméterből kinyeri annak értékét!

value :: Entry a -> a

Test>
"ten" :: [Char]
Test>
'a' :: Char

Elem prioritása (1 pont)

Adjuk meg azt a függvényt, amely a paraméterül kapott Entry típusú paraméterből kinyeri annak prioritását!

priority :: Entry a -> Priority

Test>
10 :: Priority
Test>
1 :: Priority

Konvertálás prioritásos sorrá (4 pont)

Adjuk meg azt a függvényt, amely egy rendezett párok listájából prioritásos sort hoz létre! A feladat megoldása során ügyeljünk a következőkre:

fromList :: (Eq a) => [(Priority, a)] -> PQueue a

Test>
PQueue [] :: PQueue Int
Test>
PQueue [Entry 5 "five", Entry 4 "four", Entry 1 "one"] :: PQueue [Char]
Test>
PQueue [Entry 5 "first five", Entry 5 "second five", Entry 5 "third five", Entry 4 "four", Entry 1 "one"] :: PQueue [Char]

Konstans a teszteléshez

Az alábbi konstanst a tesztelések során fogjuk felhasználni:

priq :: PQueue String
priq = fromList [(10, "ten"), (9, "nine"), (8, "eight"), (2, "two")]

Elem hozzáadása (2 pont)

Adjuk meg azt a függvényt, amely egy újabb elemet helyez el a prioritásos sorban! A megoldás során ügyeljünk a következőkre:

push :: Entry a -> PQueue a -> PQueue a

Test>
PQueue [Entry 10 "ten", Entry 10 "another ten", Entry 9 "nine", Entry 8 "eight", Entry 2 "two"] :: PQueue [Char]
Test>
PQueue [Entry 10 "ten", Entry 9 "nine", Entry 8 "eight", Entry 2 "two", Entry 1 "one"] :: PQueue [Char]
Test>
PQueue [Entry 11 "eleven", Entry 10 "ten", Entry 9 "nine", Entry 8 "eight", Entry 2 "two"] :: PQueue [Char]

Soron következő elem (2 pont)

Adjuk meg azt a függvényt, amely a soron következő elemet adja vissza a prioritásos sorból! Mivel nem lehetünk biztosak abban, hogy a sor tartalmaz elemeket, ezért egy Maybe típusú értékkel térjen vissza.

top :: PQueue a -> Maybe (Entry a)

Test>
Just (Entry 10 "ten") :: Maybe (Entry String)
Test>
Nothing :: Maybe (Entry Int)

Segítségül a Maybe definíciója:

data Maybe a = Just a | Nothing

Soron következő elem eltávolítása (1 pont)

Adjuk meg azt a függvényt, amely a soron következő elemet elhagyja a prioritásos sorból! A függvénynek akkor is működnie kell, ha a sor üres.

pop :: PQueue a -> PQueue a

Test>
PQueue [Entry 9 "nine", Entry 8 "eight", Entry 2 "two"] :: PQueue String
Test>
PQueue [] :: PQueue Int

Pontozás (elmélet + gyakorlat)