IO in Haskell Programmierparadigmen IO in Haskell D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Sommer 2009, 22. Juni 2009, 2009 D.Rösner D. Rösner PGP 2009 . . . 1 IO in Haskell Gliederung 1 IO in Haskell Beispiele IO-Aktionen do-Notation D. Rösner PGP 2009 . . . 2 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: vordefinierte Funktionen für I/O aus dem Haskell prelude show: Wandeln von Werten in Strings show :: Show a => a -> String Prelude> show 3 "3" Prelude> show [3, 4] "[3,4]" relevante Literatur: s. u.a. [Hud00], Ch. 3.1, [Tho99], Ch. 18 D. Rösner PGP 2009 . . . 4 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. getLine: Einlesen einer Zeile als String getLine :: IO String Prelude> getLine eine Zeile eingelesen Prelude> getLine [a,b] ++ [c,d,e] Prelude> D. Rösner PGP 2009 . . . 5 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. getChar: Einlesen eines einzelnen Zeichens von Eingabe getChar :: IO Char Prelude> getChar a Prelude> getChar * Prelude> getChar ^ Prelude> D. Rösner PGP 2009 . . . 6 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. putStr: Schreiben eines Strings auf Ausgabe putStr :: String -> IO () Prelude> putStr "das ist die Ausgabe" das ist die Ausgabe Prelude> putStr ("Zeile 1 gefolgt von" ++ "\n" ++ "Zeile 2") Zeile 1 gefolgt von Zeile 2 Prelude> D. Rösner PGP 2009 . . . 7 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. IO a: I/O-Aktionen vom Typ a, d.h. ein Objekt vom Typ IO a ist ein Programm, das I/O durchführt und Wert vom Typ a liefert Spezialfall: IO () wenn nur die I/O-Aktionen, aber nicht der Rückgabewert interessieren der spezielle Haskell-Typ () enthält nur ein Element (ebenfalls () geschrieben) s.a. [Hud00], Ch. 3.1, [Tho99], Ch. 18 D. Rösner PGP 2009 . . . 9 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. durch Funktionskomposition lassen sich komplexere I/O-Funktionen gewinnen Beispiel: Ausgabe eines Strings auf eine abgeschlossene Zeile putStrLn :: String -> IO () putStrLn = putStr . (++ "\n") Beispiel: Ausgabe eines bel. Objekts als String auf eine abgeschlossene Zeile print :: Show a => a -> IO () print = putStrLn . show D. Rösner PGP 2009 . . . 10 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation die do-Notation erlaubt I/O-Aktionen zu sequentialisieren und durch I/O-Aktionen zurückgegebene Werte zu erfassen und an andere Aktionen weiterzugeben mögliche Sicht: do-Notation ergibt eine auf Haskell aufgesetzte imperative Sprache (mit Kommandos und Zuweisungen) für I/O, die aber das funktionale Modell von Haskell nicht verletzt s.a. [Hud00], Ch. 3.1, [Tho99], Ch. 18 D. Rösner PGP 2009 . . . 12 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation Beispiele: einen String exakt 4 mal ausgeben put4times :: String -> IO () put4times str = do putStrLn putStrLn putStrLn putStrLn D. Rösner PGP 2009 . . . str str str str 13 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation Beispiele: einen String n mal ausgeben putNtimes :: Int -> String -> IO () putNtimes n str = if n <= 1 then putStrLn str else do putStrLn str putNtimes (n-1) str put4times = putNtimes 4 D. Rösner PGP 2009 . . . 14 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation innerhalb eines do können Ergebnisse von I/O benannt und damit weiterverwendet werden Syntax: name <- wert_IO_Aktion Semantik: in nachfolgenden Ausdrücken kann mit name der Wert der I/O-Aktion referenziert werden D. Rösner PGP 2009 . . . 15 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation Beispiel: lies zwei Zeilen ein und gib sie in vertauschter Reihenfolge und jeweils umgedreht aus reverse2lines :: IO () reverse2lines = do line1 <line2 <putStrLn putStrLn D. Rösner PGP 2009 . . . getLine getLine (reverse line2) (reverse line1) 16 IO in Haskell Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation mit return kann veranlasst werden, dass aus einem do ein Wert eines bestimmten Typs zurückgegeben wird Beispiel: lies zwei Zeilen ein und gib sie – mit einem Leerzeichen als Separator – aneinandergehängt als einen String zurück concat2lines :: IO String concat2lines = do line1 <- getLine line2 <- getLine return (line1 ++ " " ++ line2) D. Rösner PGP 2009 . . . 17 IO in Haskell Beispiele IO-Aktionen do-Notation Literatur: I Paul Hudak. The Haskell School of Expression – Learning Functional Programming through Multimedia. Cambridge University Press, Cambridge, UK, 2000. ISBN 0-521-64338-4. Simon Thompson. Haskell - The Craft of Functional Programming. Addison Wesley Longman Ltd., Essex, 1999. 2nd edition, ISBN 0-201-34275-8; Accompanying Web site: http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e. D. Rösner PGP 2009 . . . 18