Funkcionális programozás gyakorlat

11. feladatsor

Beadandó feladat

Eszköz

Akció: végrehajtható működést leíró típus.

Például:

Eszköz

A gyakorlaton felhasznált függvények:

getLine     :: IO String
-- sor beolvasása a konzolról
putStr :: String -> IO ()
-- szöveg konzolra írása
putStrLn :: String -> IO ()
-- szöveg konzolra írása + soremelés
readFile :: FilePath -> IO String
-- adott nevű fájl beolvasása (lusta)
writeFile :: FilePath -> String -> IO ()
-- adott nevű fájl kiírása

Bővebben: http://people.inf.elte.hu/divip/haskell/actions.html

Eszköz

Írjunk olyan unit-akciót, amely bekér egy sort, és kétszer visszaírja.

echoTwice :: IO ()
echoTwice = do
line <- getLine
putStrLn line
putStrLn line

A do szintaxissal leírt akciók a leírt sorrendben hajtódnak végre.

Eszköz

Írjunk olyan unit-akciót, amely bekér egy sort. Ha üres sort kapott, jelezze, különben írja vissza a sort.

echo :: IO ()
echo = do
line <- getLine
case line of
"" -> putStrLn "Blank line."
_ -> putStrLn ("You wrote: " ++ line)

Eszköz

Írjunk olyan unit-akciót, egészen addig kér be sorokat, amíg üres sort nem adunk neki. A beadott sorokat írja vissza, a végén pedig köszönjön el.

echoUntilEmptyLine :: IO ()
echoUntilEmptyLine = do
putStr "> "
line <- getLine
case line of
"" -> putStrLn "Goodbye."
_ -> do
putStrLn ("You wrote: " ++ line)
echoUntilEmptyLine

A rekurzió tehát jól használható akciókban is.

Eszköz

Főprogram: main akció. A main akciónak unit-akciónak kell lennie.

main :: IO ()
main = do
hSetBuffering stdout NoBuffering
putStrLn "Phone book."
printHelp -- a későbbi programhoz
eventLoop emptyBook -- a későbbi programhoz

Főprogrammal rendelkező modul önállóan is lefordítható és futtatható.

ghc --make Akciok.hs

Feladat

Írj olyan akciót, amely a következő üzenetet írja ki:

Commands:
? - search
+ - new entry
s - save phonebook
l - load phonebook
n - print names
q - quit
printHelp :: IO ()

Tipp: az unlines függvényt érdemes használni.

Feladat

Írj olyan akciót, amely egy szöveget soremelés nélkül ír ki, majd bekér egy sort.

prompt :: String -> IO String

Feladat

Írj olyan akciót, amely bekér egy nevet, és egy előre megadott telefonkönyvben (lásd előző feladatsor) megkeresi a hozzá tartozó számot.

findAction'' :: PhoneBook -> IO ()

Módosítsd az akciót úgy, hogy ha üres nevet kapott, akkor ne kísérelje meg a keresést.

findAction' :: PhoneBook -> IO ()

Feladat

Módosítsd az előző akciót úgy, hogy ha nemüres nevet kapott, akkor folytassa a keresést egy új névvel.

findAction :: PhoneBook -> IO ()

Feladat

Készíts olyan akciót, amely hozzáad egy bejegyzést egy meglevő telefonkönyvhöz. Addig lehessen bejegyzéseket megadni, amíg nem üres nevet adunk meg.

addAction :: PhoneBook -> IO PhoneBook

Feladat

Készíts mini parancsértelmező akciót.

eventLoop' :: PhoneBook -> IO ()

Kezdetben kérjen be egy szöveget.

Feladat

Egészítsd ki a parancsértelmezőt úgy, hogy "s" paranccsal el lehessen menteni a telefonkönyvet.

saveAction :: PhoneBook -> IO ()

Az akció kérje be a fájlnevet, amelyhez csatolja a .book kiterjesztést.

Ennek párjaként az "l" paranccsal lehessen betölteni a telefonkönyvet.

loadAction :: IO PhoneBook

Feladat

Egészítsd ki a parancsértelmezőt úgy, hogy "n" paranccsal ki lehessen íratni a telefonkönyv neveit.

printNames :: PhoneBook -> IO ()

Feladat

Egészítsd ki a parancsértelmezőt úgy, hogy minden más parancsra írja ki a segítséget (printHelp).