Strombasierende Interaktion
... [ Seminar "Einführung in die funktionale Programmiersprache Haskell" ]
... [ Inhaltsverzeichnis ]
... [ Zurück ]
... [ Weiter ] ...
Übersicht: Strombasierende Interaktion
Einführung
Bis jetzt liefen sämtliche Interaktionen mit dem System während einer Session immer nach dem gleichen
Muster ab. Der User übermittelte einen Ausdruck an das System, dieses berechnete dessen Wert und gab
ihn auf dem Bildschirm aus. Diese Art der Kommunikation genügt sicherlich einer Vielzahl von Ansprüchen,
jedoch werden häufig auch andere Interaktionsformen benötigt. Ein einfaches Beispiel ist die Ausgabe des Echos einer Eingabe
auf dem Bilschirm, wobei die kleingeschriebenen Zeichen in große konvertiert werden. Komplexere Varianten
sind beispielsweise interaktive Spiele oder ganze Betriebssysteme.
Im Folgenden soll ein kurzer Überblick über die Möglichkeiten der Interaktion mit dem System gegeben werden.
Allerdings soll in diesem Kapitel nur auf das Konzept der "strombasierenden Interaktion" (engl. stream-based interaction)
eingegangen werden. Neuere Konzepte wie Monaden sind Gegenstand einer folgenden Seminararbeit.
Beispiele
Ein strombasierendes, iteraktives Programm wird in Form einer Funktion f
realisiert, die folgende
Signatur besitzt:
Während der Laufzeit von f
ist der Input der Funktion beispielsweise eine Sequenz von
Zeichen, die mit Hilfe der Tastatur übermittelt werden.
Um das anfangs angesprochene Echo-Beispiel aufzugreifen,
könnten die eingegebenen Zeichen durch Anwendung der Funktion
map capitalise :: String -> String
in große Zeichen konvergiert werden. Hier nocheinmal
die Definiton der bereits bekannten Funktion capitalise
:
capitalise :: Char -> Char
capitalise c = if isLower c then chr (offset + ord c) else c
where offset = ord 'A' - ord 'a'
Um ein interaktives Programm zu starten, stellt Haskell das Kommando interact
zur Verfügung.
interact :: (String -> String) -> IO()
Dieses Kommando veranlaßt Haskell in einen
interaktiven Modus zu wechseln. Der Folgende Ausdruck unter Nutzung des Kommandos interact
sowie
der Funktion capitalise
wandelt bei nachfolgender Eingabe beliebiger kleingeschriebener Zeichen
diese "interaktiv" in großgeschriebene um.
Bsp.:
? interact (map capitalise)
HELLO, WORLD!
Das Programm arbeitet vollkommen interaktiv. Das heißt, bei Eingabe eines kleinen Buchstabens wird dieser
sofort in einen grßen Buchstaben konvertiert und ausgegeben. Das Verlassen des interaktiven Modus kann
bei diesem Programm nur "gewaltsam"(strg-c) geschehen, da in diesem Sinne keine Abbruchbedingung
für unser Programm definiert wurde.
Eine Abbruchbedingung ist z.B. die Eingabe eines bestimmten
Zeichens, beispielsweise ein ".", bei dessen Eingabe das Programm terminiert. Eine Realisierung hierfür
ist folgende Funktion:
capitalises :: String -> String
capitalises = takeWhile(≠ '.') · map capitalise
Dieses Programm verhält sich genauso wie das zuvor definierte, allerdings mit dem Unterschied, dass es bei Eingabe eines
Punktes selbständig terminiert. Der Punkt wird in diesem Fall nicht mit auf dem Bildschirm ausgegeben.
Der Kreativität in der Nutzung der Funktion capitalise
sind im Prinzip keine Grenzen
gesetzt. Vorstellbar wäre beispielsweise eine weitere Variante, bei der der Nutzer eine
Eingabe macht , diese gleichzeitig auf dem Bildschirm erscheint und dann durch "ENTER"
in einer neuen Zeile, nocheinmal konvertiert, ausgegeben wird. Hierzu definieren wir uns die Funktion echoCap:
echoCap xs = ys ++ "!" ++ map capitalise ys ++ "!" ++ echoCap (tail zs)
where (ys,zs) = span (≠ '!') xs
Die Funktion funktioniert folgendermaßen:
Die eingegebene Zeichenkette xs wird in die beiden Strings ys und zs zerlegt.
ys enthält alle Zeichen
von xs bis zum Zeilenubruch und zs den Rest. Der String ys wird auf dem Bildschirm
ausgegeben, es erfolgt ein Zeilenumbruch und eine erneute Ausgabe von ys in konvertierter
Form. Danach erfolgt ein weiterer Zeilenumbruch und weitere Eingaben werden äquivalent behandelt.
Woher kommt der Name "stream-based interaction"?
Die beschriebene Interaktionsart wird stream-based interaction genannt, weil sich in diesem
Zusammenhang die Tatsache zu Nutze gemacht wird, dass Listen "faul" ausgewertet werden.
Das Wort "stream" wird auch oft als Synonym für "faule" Listen verwendet.
Das Programm capitalises
wird beispielsweise durch die folgende Sequenz von Listen
modelliert:
capitalise ⊥ = ⊥
capitalise ('H' : ⊥) = 'H' : ⊥
capitalise ('H' : 'e' :⊥) = 'H' : 'E' :⊥
capitalise ('H' : 'e' : 'l' :⊥) = 'H' : 'E' : 'L' : ⊥
usw. ...
Diese Sequenz kann als Rückblick auf die interaktive Session betrachtet werden. Wenn nichts eingegeben wurde, dann
wird auch nichts auf dem Bildschirm ausgegeben. Falls ein 'H' eingegeben wurde, wird auch ein 'H' ausgegeben. Usw...
Bei Eingabe eines Punktes wird die interaktive Session beendet.
capitalise ('H' : 'e' : 'l' : '.' : ⊥) = ['H','E','L']
In den vorangegangenen Kapiteln wurde das undefinierte Element ⊥ benutzt, um eine noch nicht
abgeschlossene Berechnung zu bezeichnen. In diesem Fall beschreibt ⊥ nicht vorhandene Eingaben und nicht
getätigte Ausgaben. Eine besondere Art von noch nicht abgeschlossenen Rechnungen sind Endlosschleifen.
Vergleichbar mit einer Endlosschleife sind die beiden Fälle, in denen keine Eingaben mehr getätigt
werden und keine Ausgaben mehr auf dem Bildschirm erfolgen. Diese beiden Fälle werden hier durch
das undefinierte Element ⊥ beschrieben.
... [ Seminar "Einführung in die funktionale Programmiersprache Haskell" ]
... [ Inhaltsverzeichnis ]
... [ Zurück ]
... [ Weiter ] ...