Programmierparadigmen D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Sommer 2009, 22. Juni 2009, c 2009 D.Rösner D. Rösner PGP 2009... 1
Gliederung 1 D. Rösner PGP 2009... 2
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
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
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
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
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
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
I/O in Haskell: die die erlaubt I/O-Aktionen zu sequentialisieren und durch I/O-Aktionen zurückgegebene Werte zu erfassen und an andere Aktionen weiterzugeben mögliche Sicht: 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
I/O in Haskell: die : einen String exakt 4 mal ausgeben put4times :: String -> IO () put4times str = do putstrln str putstrln str putstrln str putstrln str D. Rösner PGP 2009... 13
I/O in Haskell: die : 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
I/O in Haskell: die 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 der Wert der I/O-Aktion referenziert werden name D. Rösner PGP 2009... 15
I/O in Haskell: die Beispiel: lies zwei Zeilen ein und gib sie in vertauschter Reihenfolge und jeweils umgedreht aus reverse2lines :: IO () reverse2lines = do line1 <- getline line2 <- getline putstrln (reverse line2) putstrln (reverse line1) D. Rösner PGP 2009... 16
I/O in Haskell: die 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
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