The current version of the Pipes tutorial, verwendet die folgenden zwei Funktionen in einem des Beispiels:Wie kann ich in Haskell aus einer Schleife ausbrechen?
stdout ::() -> Consumer String IO r
stdout() = forever $ do
str <- request()
lift $ putStrLn str
stdin ::() -> Producer String IO()
stdin() = loop
where
loop = do
eof <- lift $ IO.hIsEOF IO.stdin
unless eof $ do
str <- lift getLine
respond str
loop
Wie im tutorial buchbar! Selbst, P.stdin etwas komplizierter ist aufgrund der Notwendigkeit, das Ende der Eingabe zu überprüfen .
Gibt es irgendwelche schönen Möglichkeiten, um P.stdin umschreiben zu können, um keine manuelle Tail-rekursive Schleife zu benötigen und Steuerfluss-Kombinatoren höherer Ordnung zu verwenden, wie es Pstdout tut? In einer imperativen Sprache würde ich eine strukturierte verwenden while-Schleife oder eine break-Anweisung, das Gleiche zu tun:
while(not IO.isEOF(IO.stdin)){
str <- getLine()
respond(str)
}
forever(){
if(IO.isEOF(IO.stdin)){ break }
str <- getLine()
respond(str)
}
'whileM_' scheint das Gleiche zu tun, aber mit den Parametern in der" üblichen "Reihenfolge. Genau das habe ich gesucht. – hugomg
In gewisser Weise ist 'whileM_' die Argumentreihenfolge natürlicher. Allerdings benötigt das die Umkehrung des Tests, ich dachte "tue etwas bis EOF" ist natürlicher als "während (nicht EOF) etwas tun". Persönliche Präferenz. –
Ich habe auch gerade bemerkt, dass bis M_ die Bedingung nach dem Schleifenkörper überprüft. Das hätte ein anderes Verhalten als der ursprüngliche Code. – hugomg