Akció: végrehajtható működést leíró típus.
Például:
String
típusú kifejezés: karakterek listájára értékelődik kiIO String
típusú kifejezés: karakterek listáját előállító akcióra értékelődik ki()
()
a unit típus (C-ben: void
)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
Í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.
Í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)
Í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.
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
Í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.
Írj olyan akciót, amely egy szöveget soremelés nélkül ír ki, majd bekér egy sort.
prompt :: String -> IO String
Í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 ()
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 ()
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
Készíts mini parancsértelmező akciót.
eventLoop' :: PhoneBook -> IO ()
Kezdetben kérjen be egy szöveget.
"?"
: findAction
végrehajtása, új parancsra vár"+"
: addAction
végrehajtása, új parancsra vár"q"
: kilépésEgé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
Egészítsd ki a parancsértelmezőt úgy, hogy "n"
paranccsal ki lehessen íratni a telefonkönyv neveit.
printNames :: PhoneBook -> IO ()
Egészítsd ki a parancsértelmezőt úgy, hogy minden más parancsra írja ki a segítséget (printHelp
).