Vstup a výstup

Výstupní akce

putStrLn "Ahoj!" :: IO ()

Vstupní akce

getLine :: IO String

Základní funkce pro výstup

Základní funkce pro vstup

Refereční transparentnost

Dopady na vstup-výstupní chování

Vnitřní výsledek a vedlejší efekt

Operátor >>=

Přístup k hodnotě vnitřního výsledku

f :: IO a
g :: a -> IO b
f >>= g :: IO b

Operátor >>=

(>>=) :: 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.)

Funkce return

Jako vstupní akce

return :: a -> IO a
return ['A', 'h', 'o', 'j'] :: IO string

Jako výstupní akce

return :: a -> IO a
return () :: IO ()

Funkce pure

Řazení akcí, operátor >>

(>>) :: IO a -> IO b -> IO b

Funkce sequence

sequence :: [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

Funkce mapM

mapM :: (a -> IO b) -> [a] -> IO [b]
mapM f = sequence . map f

Jednoduchá práce se soubory

do notace

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)

Další IO funkce

Monáda a typ IO

(>>) :: Monad m => m a -> m b -> m b

Moduly

Použití modulu

import qualified Data.Char as C hiding (toUpper)

Obecná definice

[module Jmeno [(export1, ..., exportn)] where ]
[ import M1[spec1] ]
[ ... ]
[ import Mm[specm] ]
[ globalni_deklarace ]

Kompilace programu

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ů

Funkce show a read

Změna typu

show :: Show a => a -> String
read :: Read a => String -> a
show 123 ~>* "123"
read "123" ~>* ERROR
(read "123")::Int ~>* 123

Parsování vstupu

(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)

Syntactic sugar

case

case expression of
    pattern1 -> expression1
    ...
    patternn -> expressionn

Strážené definice funkcí

function args
   | guard1 = expression1
   ...
   | guardn = expressionn
   | otherwise = default expression