Für die Programmiersprache Clean [NSvP91] wurde eine andere
Methode zur
Einbindung von I/O Operationen in das funktionale Paradigma gewählt.
Der Grundgedanke hierbei ist: wird eine I/O Operation als
Funktion betrachtet, so hängt ihr Wert neben den offensichtlichen
explizit angegebenen Argumenten (wie zB den Dateinamen der zu lesenden
Datei) auch noch von dem Status des gesammten I/O Systems ab. Dieser
wird als Umgebung bezeichnet. Die Umgebung mujetzt den I/O Funktionen
als Parameter übergeben werden. Der Wert einer I/O Funktion ist dann
eine neue Umgebung.
Ein Clean-Programm ist eine Funktion vom Typ WORLD -> WORLD
wobei WORLD gerade eine Umgebung beschreibt. Der Typ WORLD
ist dabei noch strukturiert in eine Events-Umgebung (die den
Status von Tastatur, Maus etc angibt) und eine Files-Umgebung, welche wiederum in einzelne files strukturiert ist.
Diese Umgebungen können mit vordefinierten Funktionen
aus einer WORLD geöffnet werden, dann als Parameter zu I/O-Zwecken
gebraucht werden und schliewieder im veränderten Status
geschlossen werden.
Mit diesem Prinzip des enviroment passings ist
das Problem der referentiellen Transparenz gelöst.
Es mujetzt noch die Sequenzialisierung der einzelnen I/O Operationen
sichergestellt werden. Wird dieses nicht, so kann es im Ausdruck
F file -> (FWriteC 'a' file, FWriteC 'b' file);
dazu führen, dader erste oder der zweite Teil des Ergebnispaares
zuerst evaluiert wird, was dann zu unterschiedlichen Ergebnissen führte,
aber beides nicht zu dem wahrscheinlich erwarteten zwei verschiedenen
files in dem Ergebnispaar.
Das Problem ist hier, daauch eine Datei nur einmal in der Umgebung
vorhanden ist und, wenn sie denn mehrfach in einem Ausdruck gebraucht
wird, geshared auf dieselbe Datei verwiesen wird. Ein Objekt, auf dem
destruktive Updates gemacht werden, darf aber nicht gemeinsam genutzt
werden. Um dieses zu unterbinden wurde in Clean das Konzept der
unique types[] eingeführt. Man kann beliebige Typen als unique erklären, womit man ausdrückt, daein Objekt dieses Types
nur einmal zur Zeit referenziert werden darf. Funktionen, die wie FWriteC destruktiv ein Objekt verändern, müssen von diesem Objekt
einen als unique erklärten Typ verlangen.
Um nun den korrekten Gebrauch von unique attributierten Objekten
zu gewährleisten, ist im Kompilierer noch ein weiterer Test eingebaut,
der kontrolliert, dain keiner Funktion ein unique
attributiertes Objekt mehrfach referenziert wird.
Das Konzept der unique types soll verwandt sein mit den linear types auf Lambda-Ausdrücken. []
Als Kritik an dem Konzept in Clean wird angeführt, dain
Kompilierern bereits benutzte Codeoptimierungsverfahren eine weiterhin
konsisternte Bernutzung der unique attributierten Objekte nicht
gewährleisten.