Vstup a vstup Ing Lumr Nvrat katedra informatiky

  • Slides: 20
Download presentation
Vstup a výstup Ing. Lumír Návrat katedra informatiky, A-1018 59 732 3252

Vstup a výstup Ing. Lumír Návrat katedra informatiky, A-1018 59 732 3252

Motivace l Načtení čísla val : : Int val = 42 function : :

Motivace l Načtení čísla val : : Int val = 42 function : : Int -> Int function = val + n input. Int : : Int input. Diff = input. Int - input. Int

Motivace l Komunikace s okolním světem l l print. AString : : Real. World

Motivace l Komunikace s okolním světem l l print. AString : : Real. World -> String -> Real. World read. AString : : Real. World -> (Real. World, String) main r. W == let r. W’ == print. AString r. W "Please enter your name: "" (r. W’’, name) == read. AString r. W’ in in print. AString r. W’’("Hello, "" ++ ++ name ++ ++ ", ", how are you? ") Problém!!! FLP - Vstup a výstup 3

Minimální komunikace l Zobrazení řetězce na obrazovku Načtení řetězce z klávesnice Zápis dat do

Minimální komunikace l Zobrazení řetězce na obrazovku Načtení řetězce z klávesnice Zápis dat do souboru Načtení dat ze souboru l => v Haskellu modul IO. hs l l l

Akce ve funkcionálním programu l Imperativní jazyky l l program tvořen posloupností akcí čtení

Akce ve funkcionálním programu l Imperativní jazyky l l program tvořen posloupností akcí čtení a nastavování globálních proměnných čtení a zápis souborů Haskell l oddělení akcí od čistě funkcionálního kódu monadické operátory akce je funkce, jejíž výsledek je typu (IO a) FLP - Vstup a výstup 5

Příklady akcí l Čtení a výpis znaku l l Převod hodnoty na akci l

Příklady akcí l Čtení a výpis znaku l l Převod hodnoty na akci l l get. Char : : IO Char put. Char : : Char -> IO () return : : a -> IO a Test odpovědi y/n – posloupnost akcí l ready : : IO Bool ready = do c <- get. Char return (c == ‘y’) FLP - Vstup a výstup 6

do Notace l Flexibilní mechanismus podporující l l l Sekvenční přístup k I/O programům

do Notace l Flexibilní mechanismus podporující l l l Sekvenční přístup k I/O programům Zachycování hodnot vrácených z IO akcí a předání do akcí následujících v programu Základem je operace (>>=) : : IO a -> (a-> IO b) -> IO b IO a a IO b IO IO b

Cyklus while l Požadavek opakování IO operací while : : IO Bool -> IO

Cyklus while l Požadavek opakování IO operací while : : IO Bool -> IO () while test action = do res <- test if res then do action while test action else return ()

Funkce main Představuje hlavní program Akce, která nic nevrací: l l l main :

Funkce main Představuje hlavní program Akce, která nic nevrací: l l l main : : IO () main = do c <- get. Char put. Char c 1. Přečte znak a uloží do proměnné c vypíše znak c Vrátí výsledek poslední akce – IO () 2. 3. FLP - Vstup a výstup 9

Čtení řádku textu 1. 2. 3. Přečteme první znak. Je-li to konec řádku, vrátíme

Čtení řádku textu 1. 2. 3. Přečteme první znak. Je-li to konec řádku, vrátíme prázdný řetězec. Jinak přečteme zbytek řádku, spojíme s prvním znakem a vrátíme get. Line : : IO String get. Line = do x <- get. Char if x==‘n’ then return “” else do xs <- get. Line return (x: xs) FLP - Vstup a výstup 10

Výpis řetězce l Na všechny znaky řetězce zavoláme funkci put. Char, např. l l

Výpis řetězce l Na všechny znaky řetězce zavoláme funkci put. Char, např. l l Výsledkem je seznam akcí l l map put. Char xs map : : (a -> b) -> [a] -> [b] put. Char : : Char -> IO () map put. Char s : : [IO ()] Převod na jedinou akci l sequence : : [IO()] -> IO () put. Str : : String -> IO () put. Str s = sequence (map put. Char s) FLP - Vstup a výstup 11

Zpracování výjimek l Výjimky jsou instance abstraktní třídy IOError l Ke každé výjimce XXX

Zpracování výjimek l Výjimky jsou instance abstraktní třídy IOError l Ke každé výjimce XXX existuje funkce is. XXX : : IOError -> Bool l l is. EOFError is. Does. Not. Exist. Error FLP - Vstup a výstup 12

Zpracování výjimek l Generování výjimky – funkce fail : : IOError -> IO a

Zpracování výjimek l Generování výjimky – funkce fail : : IOError -> IO a l l typ výsledku se přizpůsobí kontextu Zachycení výjimky - funkce catch: catch : : IO a -> (IOError -> IO a) -> IO a prováděná akce 2. obsluha výjimky – zavolá se, pokud nastane výjimka; vrátí náhradní výsledek 3. výsledkem je akce z bodu 1 nebo 2 1. FLP - Vstup a výstup 13

Čtení znaku + výjimky l S ignorováním všech výjimek get. Char’ = get. Char

Čtení znaku + výjimky l S ignorováním všech výjimek get. Char’ = get. Char `catch` ( _ -> return ‘n’ ) l l l nastane-li chyba (např. konec souboru), vrátí znak konce řádku nerozliší konec souboru od ostatních chyb použití `catch` jako infixového operátoru FLP - Vstup a výstup 14

Čtení znaku + výjimky l S rozlišením konce souboru get. Char’ = get. Char

Čtení znaku + výjimky l S rozlišením konce souboru get. Char’ = get. Char `catch` eof. Handler where eof. Handler e = if is. EOFError e then return ‘n’ else fail e l l Pokud se dostaneme na konec souboru, vracíme znak konce řádku Ostatní výjimky se předávají dále FLP - Vstup a výstup 15

Otevření a uzavření souboru type File. Path = String data IOMode = Read. Mode

Otevření a uzavření souboru type File. Path = String data IOMode = Read. Mode | Write. Mode | Append. Mode | Read. Write. Mode data Handle open. File : : File. Path -> IOMode -> IO Handle h. Close : : Handle -> IO () FLP - Vstup a výstup 16

Čtení ze souboru stdin, stdout, stderr : : Handle h. Get. Char : :

Čtení ze souboru stdin, stdout, stderr : : Handle h. Get. Char : : Handle -> IO Char get. Char = h. Get. Char stdin l funkce začínající na ‘h’ dostávají jako první parametr referenci na otevřený soubor, ostatní pracují se standardními soubory h. Get. Contents : : Handle -> String l l přečte celý obsah souboru líné vyhodnocení – vstup se požaduje až při požadavku na konkrétní hodnotu FLP - Vstup a výstup 17

Příklad import IO main = do hin <- opf “From: “ Read. Mode hout

Příklad import IO main = do hin <- opf “From: “ Read. Mode hout <- opf “To: “ Write. Mode contents <- h. Get. Contents hin h. Put. Str hout contents h. Close hout put. Str “Done. ” opf : : String -> IOMode -> IO Handle opf prompt mode = do put. Str prompt name <- get. Line open. File name mode FLP - Vstup a výstup 18

Příklad l l Funkce opf se zeptá na jméno souboru a otevře ho v

Příklad l l Funkce opf se zeptá na jméno souboru a otevře ho v zadaném režimu Pokud se otevření nepodaří, vznikne výjimka opf prompt mode = do put. Str prompt name <- get. Line catch (open. File name mode) (_ -> do put. Str (“Open errorn”) opf prompt mode) FLP - Vstup a výstup 19

Úkol pro cvičení Vytvořte program, který opíše soubor na standardní výstup s očíslovanými řádky.

Úkol pro cvičení Vytvořte program, který opíše soubor na standardní výstup s očíslovanými řádky. 1) Převod textu na seznam řádků text 2 lines : : String -> [String] 2) Očíslování řádků numbering : : [String] -> [String] 3) Převod seznamu řádků na text lines 2 text : : [String] -> String (lines 2 text. numbering. text 2 lines) contents FLP - Vstup a výstup 20