Eine zweite Möglichkeit I/O in refentiell transparenter Weise in Gofer zu realisieren, ist über Continuations. Hier steht der sequentialisierte Charakter von I/O-Funktionen im Vordergrund. Eine I/O-Funktion hat dabei immer eine Reihe von Argumenten nach folgenden Muster: zuerst folgen die Argumente, die für die I/O-Operation notwendig sind. Dieses kann z.B. der Dateiname einer zu lesenden Datei sein. Dann folgt als ein weiteres Argument eine I/O-Funktion, die ausgeführt werden soll, wenn die I/O-Operation vom Betriebssystem nicht erfolgreich abgeschlossen werden kann, und als ein letztes Argument folgt die I/O-Funktion, die ausgeführt werden soll, wenn die I/O-Operation vom Betriebssystem erfolgreich abgeschlossen werden konnte. In der Gofer-Prelude sind solche Continuation-I/O-Funktionen definiert. Mit ihnen läßt sich recht bequem I/O in Gofer realisieren.
Beispiele:
helloWord = appendChan stdout "hello worls\n" abort done
showFile name
= readFile
name
(\_ -> appendChan stdout ("Can't open " ++ name) abort done)
(\result -> appendChan stdout result abort done)
moin = appendChan stdout "Geben Sie ein Zahl ein: " abort readzahl
readzahl = readChan stdin abort writequadrat
writequadrat zahl = appendChan stdout
("\n Das Quadrat von
++ (head (lines zahl))
++ " ist: "++ ausgabe ++ "!\n" )
abort done
where
ausgabe = int2string ((str2int (head (lines zahl)))^2)
str2int x = str2intaux x 0
str2intaux "" a = a
str2intaux (n:ns) a = str2intaux ns ((10*a)+(ord n) - 48)