ich den folgenden Code haben:Haskell IO Ausführungsreihenfolge
import Control.Monad (unless)
import System.IO (isEOF, hFlush, stdout)
main :: IO()
main = unlessFinished $ do
putStr "$ "
hFlush stdout
getLine >>= putStrLn
main
where
unlessFinished action = isEOF >>= flip unless action
Wenn ich diesen Code kompilieren und ausführen, zeigt es einen Cursor am Anfang der Leerzeile und erst nachdem ich [Enter] it Ausgänge $
und was auch immer ich geschrieben hatte.
Es scheint, dass getLine
vor putStr "$ "
obwohl IO
Monade Garantien aufgerufen wird, dass es die Aktionen in der Reihenfolge aufgerufen werden sie im Code sequenziert sind (oder so verstehe ich, was here geschrieben). Warum funktioniert es nicht richtig?
By the way, ich habe eigentlich nicht, dass Sie glauben, bis ich den Code selbst versucht läuft. Dann sagte ich tatsächlich "whaaaaa ...?!" laut in meiner Kabine. Nette Arbeit, die deine Frage in eine so schöne, verdauliche, überraschende Form bringt! –
Danke. Es war auch für mich überraschend. Eigentlich fing ich an zu glauben, dass es nicht Haskells "Fehler" ist, sondern eine andere Shell/Terminal/OS-Falle, von der ich vorher nichts wusste. :) – Sventimir