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:
f :: String -> String
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 ] ...