Linkek kiemelése

Használható segédanyagok: Haskell könyvtárainak dokumentációja, (lokális!) Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármilyen kérdés, észrevétel felmerül, azt a felügyelőknek kell jelezni, nem a diáktársaknak!

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! A függvények definíciójában lehet, sőt javasolt is alkalmazni a korábban definiált függvényeket (függetlenül attól, hogy sikerült-e azokat megadni).

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

Ebben a feladatban egy olyan függvényt kell elkészíteni, amelyik egy szöveget kap és abból kiemel URL-eket, és hivatkozásokra cseréli ezeket, majd a szöveg végére egy listát készít a hivatkozásokból. A hivatkozási lista a sorszámokkal együtt tartalmazza az előforduló linkeket, mindegyiket csak egyszer.

Az URL-ek könnyebb megkülönböztetésére létrehozunk egy nevesített típust:

type Link = String

Linkek felismerése (1 pont)

Készítsünk egy függvényt, amely egy szóról megállapítja, hogy link vagy sem! A linkeket onnan ismerhetjük fel, hogy < és > jelek között szerepelnek.

isLink :: String -> Bool

Test>
True :: Bool
Test>
False :: Bool
Test>
True :: Bool
Test>
False :: Bool

Számok átalakítása szöveggé (2 pont)

Készítsünk egy olyan függvényt, amely egy nemnegatív egész számot tud szöveggé alakítani! A szöveges reprezentációt tízes számrendszerben kell előállítanunk.

itoa :: Int -> String

Test>
"1" :: String
Test>
"12" :: String
Test>
"123" :: String
Test>
"1234" :: String

Hivatkozások formázása (1 pont)

Készítsünk egy függvényt, amely egy nemnegatív egész számnak mint egy hivatkozás sorszámának megadja a szöveges alakját! A hivatkozások alakja [<sorszám>].

formatIndex :: Int -> String

Test>
"[0]" :: String
Test>
"[9]" :: String
Test>
"[99]" :: String

Linkek leválogatása és sorszámozása (2 pont)

Írjunk egy függvényt, amely szavak egy listájából leválogatja a linkeket és besorszámozza ezeket 1-től kezdődően! Ügyeljünk arra, hogy minden URL csak egyszer szerepelhet a keletkező listában!

indexLinks :: [String] -> [(Int, Link)]

Test>
[(1, "http://haskell.org/")] :: [(Int, Link)]
Test>
[(1, "http://haskell.org/")] :: [(Int, Link)]
Test>
[(1, "http://haskell.org/")] :: [(Int, Link)]
Test>
[(1, "http://haskell.org/"), (2, "http://clean.cs.ru.nl/")] :: [(Int, Link)]

Linkek listájának szöveggé alakítása (2 pont)

Definiáljunk egy függvényt, amellyel hivatkozási listát tudunk szöveggé alakítani! A lista minden egyes elemét tegyük külön sorba: ezt úgy tudjuk elérni, hogy mindegyik után egy sortörés karaktert ('\n') helyezünk el.

listLinks :: [(Int, Link)] -> String

Test>
"[1] http://haskell.org/\n[2] http://clean.cs.ru.nl/\n[3] http://example.com/\n" :: String

Linket tartalmazó szöveg feldolgozása (3 pont)

Írjunk egy olyan függvényt, amely az eddig definiált függvények segítségével kicseréli egy szövegben a benne található URL-ket a nekik megfelelő hivatkozások sorszámára, majd a létrejövő hivatkozási listát egy üres sorral elválasztva hozzácsatolja! Amennyiben nem találhatóak a szövegben URL-ek, úgy ne tegyünk utána üres sort.

extractLinks :: String -> String

Test>
"Those are Haskell [1] and Clean [2]\n\n[1] http://haskell.org/\n[2] http://clean.cs.ru.nl/\n" :: String
Test>
"Haskell [1] can be used at many places\n\n[1] http://haskell.org/\n" :: String
Test>
"This text does not have any links" :: String
Test>
"In Haskell [1] or at its website [1] there are many things\n\n[1] http://haskell.org/\n" :: String

Pontozás