IO in Haskell IO in Haskell Gliederung Programmierparadigmen IO in Haskell 1 D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg IO in Haskell Beispiele IO-Aktionen do-Notation c Sommer 2009, 22. Juni 2009, 2009 D.Rösner D. Rösner PGP 2009 . . . IO in Haskell 1 D. Rösner PGP 2009 . . . Beispiele IO-Aktionen do-Notation IO in Haskell 2 Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. I/O in Haskell: getLine: Einlesen einer Zeile als String vordefinierte Funktionen für I/O aus dem Haskell prelude getLine :: IO String show: Wandeln von Werten in Strings show :: Show a => a -> String Prelude> getLine eine Zeile eingelesen Prelude> show 3 "3" Prelude> show [3, 4] "[3,4]" relevante Literatur: s. u.a. [Hud00], Ch. 3.1, [Tho99], Ch. 18 Prelude> getLine [a,b] ++ [c,d,e] Prelude> D. Rösner PGP 2009 . . . 4 D. Rösner PGP 2009 . . . 5 IO in Haskell Beispiele IO-Aktionen do-Notation IO in Haskell I/O in Haskell: cont. Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. getChar: Einlesen eines einzelnen Zeichens von Eingabe putStr: Schreiben eines Strings auf Ausgabe getChar :: IO Char putStr :: String -> IO () Prelude> getChar a Prelude> getChar * Prelude> getChar ^ Prelude> 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 . . . IO in Haskell 6 D. Rösner PGP 2009 . . . Beispiele IO-Aktionen do-Notation IO in Haskell I/O in Haskell: cont. 7 Beispiele IO-Aktionen do-Notation I/O in Haskell: cont. durch Funktionskomposition lassen sich komplexere I/O-Funktionen gewinnen 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 Beispiel: Ausgabe eines Strings auf eine abgeschlossene Zeile Spezialfall: IO () putStrLn :: String -> IO () putStrLn = putStr . (++ "\n") wenn nur die I/O-Aktionen, aber nicht der Rückgabewert interessieren der spezielle Haskell-Typ () enthält nur ein Element (ebenfalls () geschrieben) Beispiel: Ausgabe eines bel. Objekts als String auf eine abgeschlossene Zeile print :: Show a => a -> IO () print = putStrLn . show s.a. [Hud00], Ch. 3.1, [Tho99], Ch. 18 D. Rösner PGP 2009 . . . 9 D. Rösner PGP 2009 . . . 10 IO in Haskell Beispiele IO-Aktionen do-Notation IO in Haskell I/O in Haskell: die do-Notation Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation die do-Notation erlaubt Beispiele: I/O-Aktionen zu sequentialisieren und durch I/O-Aktionen zurückgegebene Werte zu erfassen und an andere Aktionen weiterzugeben einen String exakt 4 mal ausgeben put4times :: String -> IO () 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 put4times str = do putStrLn putStrLn putStrLn putStrLn str str str str s.a. [Hud00], Ch. 3.1, [Tho99], Ch. 18 D. Rösner PGP 2009 . . . IO in Haskell 12 Beispiele IO-Aktionen do-Notation D. Rösner PGP 2009 . . . IO in Haskell I/O in Haskell: die do-Notation 13 Beispiele IO-Aktionen do-Notation I/O in Haskell: die do-Notation Beispiele: einen String n mal ausgeben putNtimes :: Int -> String -> IO () innerhalb eines do können Ergebnisse von I/O benannt und damit weiterverwendet werden putNtimes n str = if n <= 1 then putStrLn str else do putStrLn str putNtimes (n-1) str Syntax: name <- wert_IO_Aktion Semantik: in nachfolgenden Ausdrücken kann mit name der Wert der I/O-Aktion referenziert werden put4times = putNtimes 4 D. Rösner PGP 2009 . . . 14 D. Rösner PGP 2009 . . . 15 IO in Haskell Beispiele IO-Aktionen do-Notation IO in Haskell I/O in Haskell: die do-Notation I/O in Haskell: die do-Notation Beispiel: 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 in vertauschter Reihenfolge und jeweils umgedreht aus lies zwei Zeilen ein und gib sie – mit einem Leerzeichen als Separator – aneinandergehängt als einen String zurück concat2lines :: IO String reverse2lines :: IO () reverse2lines = do line1 <line2 <putStrLn putStrLn getLine getLine (reverse line2) (reverse line1) D. Rösner PGP 2009 . . . IO in Haskell concat2lines = do line1 <- getLine line2 <- getLine return (line1 ++ " " ++ line2) 16 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 . . . Beispiele IO-Aktionen do-Notation 18 D. Rösner PGP 2009 . . . 17