IO aVýstupní akce
IO ()putStrLn "Ahoj!" :: IO ()
Vstupní akce
IO a, která typová proměnná a nabývá hodnoty (typu) podle typu objektu, který vstupuje.getLine :: IO String
putChar :: Char -> IO () = Zapíše znak na stdoutputStr :: String -> IO () = Zapíše řetězec na stdoutputStrLn :: String -> IO () = to co putStr a přidá znak konce řádkuprint :: Show a => a -> IO () = vypíše jakoukoli hodnotu tisknutelného typugetChar :: IO Char = Načte znak ze stdingetLine :: IO String = Načte řádek ze stdingetContents :: IO String = Čte líně veškerý obsah ze stdin jako řetězecinteract :: (String -> String) -> IO ()
getLine.>>=.f >>= g funguje operátor >>= tak, že vezme vnitřní výsledek vstupní akce f a na tento aplikuje unární funkci g, jejímž výsledkem je ovšem vstup-výstupní akce.f :: IO a
g :: a -> IO b
f >>= g :: IO b
(>>=) :: IO a -> ( a -> IO b ) -> IO b
-- ekvivalentní zápis
getLine >>= putStr
getLine >>= (\x -> putStr x)
“Jakmile jste v IO, nelze utéct.” (Jakmile jste v krabici, zůstanete v krabici.)
returnreturn :: a -> IO a
return ['A', 'h', 'o', 'j'] :: IO string
return může sloužit i jako výstupní akce, která nemá žádný efekt.return :: a -> IO a
return () :: IO ()
purereturnreturn je vzhledem ke kontextu známého z imperativních programovacích funkcí částečně matoucí.>>(>>) :: IO a -> IO b -> IO b
sequencesequence :: [IO a] -> IO [a]
sequence [] = return []
sequence (a:s) = do x<-a
t <- sequence s
return (x:t)
-- Použití:
sequence [ putStr "Ahoj", putStr " ", putStr "světe!" ]
sequence [ getLine, getLine, getLine ] >>= print
mapMmapM :: (a -> IO b) -> [a] -> IO [b]
mapM f = sequence . map f
type FilePath = StringreadFile :: FilePath -> IO String = líně načte obsah souboru jako řetězecwriteFile :: FilePath -> String -> IO () = zapíše řetězec do daného souboru (existující obsah smaže).appendFile :: FilePath -> String -> IO () = Připíše řetězec do daného souboru.do notacedo slouží k alternativnímu zápisu s operátory >>= a >>.putStr "vstup?" >>
getLine >>= \ x ->
putStr "výstup?" >>
getLine >>= \ y ->
readFile x >>= \ z ->
writeFile y (map toUpper z)
-- ekvivalentně pomocí do
do putStr "vstup?"
x <- getLine
putStr "výstup?"
y <- getLine
z <- readFile x
writeFile y (map toUpper z)
System.IO, System.Directory, System.TimeMonad je zobecněním typu IO(>>) :: Monad m => m a -> m b -> m b
Mian, která následně importuje a používá funkce z jiných modulů.Prelude je implicitně zavedený modul, který obsahuje definice funkcí, které jsme doposud běžně používali.importjmeno_modulu.jmeno_funkce (kvalifikace).import qualified Data.Char as C hiding (toUpper)
C.toUpper.head[module Jmeno [(export1, ..., exportn)] where ]
[ import M1[spec1] ]
[ ... ]
[ import Mm[specm] ]
[ globalni_deklarace ]
module Main (main) where.Prelude, automaticky se doplní.ghc.main :: IO (). Je automaticky spuštěna pod zavedení programu do paměti.hello.hs // Zdrojový kód s funkcí `main`
ghc hello.hs -o hello // Překlad
hello . // Spustitelný soubor
hello.hi a hello.o // Pomocné soubory pro zrychlení překladu více souborů
show a readZměna typu
String.show :: Show a => a -> String
read :: Read a => String -> a
read musíme uvést typ, do kterého chceme transformovat.show 123 ~>* "123"
read "123" ~>* ERROR
(read "123")::Int ~>* 123
(read "[1,2,3]")::[Char] ~>* ERROR
(read "[1,2,3]")::[Float] ~>* [1.0,2.0,3.0]
main = do putStrLn "Napis cele cislo:"
x <- getLine
print (1 + read x::Int)
casecase.case expression of
pattern1 -> expression1
...
patternn -> expressionn
Bool přidružený k definičnímu přiřazení.True.function args
| guard1 = expression1
...
| guardn = expressionn
| otherwise = default expression