#include "head.html"

Die Außenwelt - IO

Denken wir zurück an die Zustandsmonade (beim Baum-numerieren)
data ST a = ST (Int -> (a, Int))
Ihr Vorteil war, daß sie den Zustand vor dem Nutzer versteckt (kapselt) und nur wenige Operationen erlaubt (exportiert).

Das gibt uns die Möglichkeit, Operationen, die Wirkungen auf die "wirkliche Welt" haben (z. B. Eingabe, Ausgabe, File-Operation) als Aktionen in einer Zustandsmonade aufzufassen. Die Zustandsvariable ist die Welt, aber durch die Kapselung sehen wir sie nicht explizit. Wir können also damit auch keinen Unfug anstellen (etwa die Welt löschen oder vervielfachen).

Diese Monade heißt IO. Das ist, wie sich das gehört, ein Typkonstruktor. Ein f :: IO a ist also eine IO-Aktion, die (möglicherweise) eine Wirkung auf die Welt hat, und ein Ergebnis :: a. Beispiele:

getLine :: IO String
putStrLn :: String -> IO ()
in der zweiten Zeile haben wir den häufigen Fall, daß uns das Ergebins nicht interessiert (deswegen ()), wohl aber die Wirkung (das Drucken der Zeile).

Mit der IO-Monade kann man nun imperativ funktional programmieren. Schreiben wir der Übung halber einen Ersatz für die Unix-Funktion "cat":

#include "../src/Cat.hs"
Da kann man kaum noch erkennen, ob es nun Haskell oder C ist.

Ein solches Hauptprogramm können wir entweder separat unter hugs ausführen

runhugs Cat.hs arg1 arg2 ...
oder kompilieren (wenn wir einen Compiler haben)
ghc -o Cat Cat.hs
und dann wie jede andere Exe ausführen.

Aufgabe

Implementiere einen Ersatz für die Unix-Funktion "wc" (word count, zählt Zeichen, Wörter und Zeilen, und addiert das schließlich für alle Argumente). #include "foot.html"