IO in Haskell - Universität Magdeburg

Werbung
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
Herunterladen