Programmieren in Haskell Ein- und Ausgaben Der Typ IO mit Hilfe des abstrakten Typs `IO val' werden Aktionen beschrieben, die Ein- oder Ausgaben vornehmen. Allgemeiner: ..., die mit dem Betriebssystem oder der Umgebung kommunizieren. ---------------------------------------------------------------------> data IO val ---------------------------------------------------------------------Ein Element vom Typ `IO val' beschreibt eine EA-Aktion, die einen Wert vom Typ `val' zurückgibt. Vordefinierte Ausgabefunktionen > putChar :: Char -> IO () > putStr :: String -> IO () > print :: (Show a) => a -> IO () •putChar gibt ein einzelnes Zeichen aus •putStr gibt einen String aus •print wendet erst die show-Funktion auf die Eingabe an und gibt das Ergebnis aus Vordefinierte Eingabefunktionen > getChar > getLine :: IO Char :: IO String •getChar liest ein einzelnes Zeichen ein •getLine liest einen String ein Vordefinierte Operationen auf Dateien. > type FilePath = String > > readFile :: FilePath -> IO String > writeFile :: FilePath -> String -> IO () > appendFile :: FilePath -> String -> IO () •readFile liest den Inhalt einer Datei ein und gibt diesen als String zurueck •writeFile schreibt einen String in eine Datei •appendFile haengt einen String an eine Datei an Verknüpfung von EA-Aktionen > return > (>>) > (>>=) :: a -> IO a :: IO a -> IO b -> IO b :: IO a -> (a -> IO b) -> IO b •return verpackt einen Wert in den IO-Typ •>> haengt zwei IO-Aktionen hintereinander •>>= haengt zwei IO-Aktionen hintereinander und uebergibt das Ergebnis der ersten an die zweite Beispiel > askFor > askFor s > > io1 > io1 > > :: String -> IO String = putStr s >> getLine :: IO () = askFor "filename: " readFile file putStr cnts >>= \file -> >>= \cnts -> Syntaktischer Zucker: do - Notation > io = f >>= \x -> > g x >> = \y -> > hy ist gleichbedeutend mit > io = do > x <- f > y <- g x > hy Syntaktischer Zucker: do - Notation > askFor > askFor s > > io1 > io1 > > :: String -> IO String = putStr s >> getLine :: IO () = askFor "filename: " readFile file putStr cnts > io2 > io2 > > > :: IO () = do file <- askFor "filename: " cnts <- readFile file putStr cnts >>= \file -> >>= \cnts -> Kommandozeilenparameter getArgs :: IO [String] getArgs liefert die Liste der Kommandozeilenparameter > import System > main = do > args <- getArgs > cat args > cat [] = return () > cat (f:fs) = do > cnts <- readFile f > putStr cnts > cat fs Kompilieren mit dem ghc • ghc = Glasgow Haskell Compiler • jedes Programm muss eine main-Funktion enthalten. Diese wird beim Programmstart aufgerufen • Beispiel: ghc --make ea.lhs -o ea • Aufruf: ./ea fileA fileB Beispiel