Funktionale Programmierung

Werbung
Lazy I/O in Haskell
Lazy I/O in Haskell
Gliederung
Funktionale Programmierung
Haskell: Lazy IO
1
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
Lazy I/O in Haskell
hGetContents
readFile und writeFile
interact
c
Sommer 2013, 16. Mai 2013, 2011-13
D.Rösner
D. Rösner
Lazy I/O in Haskell
FP 2013 . . .
D. Rösner
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell:
Lazy I/O in Haskell
FP 2013 . . .
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
Haskell ist ’lazy’
hGetContents :: Handle -> IO String
Daten werden nur ausgewertet, wenn der Wert tatsächlich
benötigt wird
der von hGetContents zurückgegebene String wird
’lazy’ berechnet
das gilt auch für I/O
beim Aufruf von hGetContents wird zunächst garnichts
gelesen
Beispiel: Funktion hGetContents
Typ: hGetContents :: Handle -> IO String
erst dann wird vom Handle gelesen, wenn Elemente der
Liste (also: Zeichen) verarbeitet werden
relevante Literatur: s. u.a. [OGS09], Ch. 7, [Tho11],
[Tho99], Ch. 18
...
D. Rösner
FP 2013 . . .
[OGS09], Ch. 7
D. Rösner
FP 2013 . . .
Lazy I/O in Haskell
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
Lazy I/O in Haskell
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
hGetContents :: Handle -> IO String
-- file: ch07/toupper-lazy1.hs
import System.IO
import Data.Char(toUpper)
...
sofort, wenn Elemente nicht mehr benötigt werden, gibt
der Garbage collector von Haskell den zugehörigen
Speicher frei
der Benutzer muß sich nicht darum kümmern
für ihn geschieht alles völlig transprarent
es steht der Inhalt der Datei als reiner String zur
Verfügung, der mit reinem Code verarbeitet werden kann
[OGS09], Ch. 7
main :: IO ()
main = do
inh <- openFile "input.txt" ReadMode
outh <- openFile "output.txt" WriteMode
inpStr <- hGetContents inh
let result = processData inpStr
hPutStr outh result
hClose inh
hClose outh
processData :: String -> String
processData = map toUpper
[OGS09], Ch. 7
D. Rösner
Lazy I/O in Haskell
D. Rösner
FP 2013 . . .
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
Lazy I/O in Haskell
FP 2013 . . .
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
-- file: ch07/toupper-lazy2.hs
import System.IO
import Data.Char(toUpper)
da sehr oft Dateien gelesen, ihr Inhalt verarbeitet und das
Ergebnis wieder in eine Datei geschrieben wird, gibt es mit
main = do
inh <- openFile "input.txt" ReadMode
outh <- openFile "output.txt" WriteMode
inpStr <- hGetContents inh
hPutStr outh (map toUpper inpStr)
hClose inh
hClose outh
zwei Funktionen zum komfortablen Arbeiten mit Dateien
als Strings
die Typen:
[OGS09], Ch. 7
[OGS09], Ch. 7
D. Rösner
FP 2013 . . .
readFile und
writeFile
ghci> :type readFile
readFile :: FilePath -> IO String
ghci> :type writeFile
writeFile :: FilePath -> String -> IO ()
D. Rösner
FP 2013 . . .
Lazy I/O in Haskell
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
Lazy I/O in Haskell
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
-- file: ch07/toupper-lazy3.hs
import Data.Char(toUpper)
main = do
inpStr <- readFile "input.txt"
writeFile "output.txt" (map toUpper inpStr)
readFile verwendet hGetContents intern
für die gängige Situation des Lesens von Standard-Input,
Konvertierens der Eingabe und Ausgabe auf
Standard-Output:
interact :: (String -> String) -> IO ()
-- file: ch07/toupper-lazy4.hs
import Data.Char(toUpper)
main = interact (map toUpper)
[OGS09], Ch. 7
[OGS09], Ch. 7
D. Rösner
Lazy I/O in Haskell
FP 2013 . . .
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
D. Rösner
Lazy I/O in Haskell
FP 2013 . . .
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
Beispiel: Filtern mit interact
einfache interaktive Programme mit interact
-- file: ch07/toupper-lazy6.hs
import Data.Char(toUpper)
main = interact
((++) "Your data, in uppercase, is:\n\n" .
map toUpper)
-- file: ch07/filter.hs
main = interact
(unlines . filter (elem ’a’) . lines)
Hilfsfunktionen:
lines :: String -> [String]
unlines :: [String] -> String
[OGS09], Ch. 7
[OGS09], Ch. 7
D. Rösner
FP 2013 . . .
D. Rösner
FP 2013 . . .
Lazy I/O in Haskell
hGetContents
readFile und writeFile
interact
Lazy I/O in Haskell: cont.
-- file: ch07/reverseLines.hs
main = interact
(unlines . map reverse . lines)
mögliche Nutzung:
H:\Daten\work\haskell\code\realWorldHaskell\ch07>runghc reverseLines.hs
nur du gudrun
nurdug ud run
eine treue familie bei lima feuerte nie
ein etreuef amil ieb eilimaf euert enie
^Z
H:\Daten\work\haskell\code\realWorldHaskell\ch07>
Lazy I/O in Haskell
FP 2013 . . .
hGetContents
readFile und writeFile
interact
Literatur: II
Simon Thompson.
Haskell - the craft of functional programming.
Pearson Education Ltd., Essex, 2011.
3rd edition, ISBN 978-0-201-88295-7; Accompanying Web
site: http://www.haskellcraft.com.
D. Rösner
hGetContents
readFile und writeFile
interact
Literatur: I
Beispiel: Umdrehen der Zeilen der Eingabe bei interact
D. Rösner
Lazy I/O in Haskell
FP 2013 . . .
Bryan O’Sullivan, John Goerzen, and Don Stewart.
Real World Haskell.
O’Reilly Media, Sebastopol, CA 95472, 2009.
ISBN 978-0-596-51498-3; online available at
http://book.realworldhaskell.org/.
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
FP 2013 . . .
Herunterladen