Falsche IO Aktionen Reihenfolge mit putstr und getLine
Frage
Ich habe den folgenden Code:
main = do
putStr "Test input : "
content <- getLine
putStrLn content
Wenn ich es laufen (mit runhaskell
) oder kompilieren (ghc 6.10.4) ist das Ergebnis wie folgt aus:
asd
Test input : asd
Warum ist Test input : asd
Wesen nach asd
gedruckt?
In dem Codebeispiel auf http://learnyouahaskell.com/ , die putStr
verwendet, ist die getLine
Ausgabe präsentiert ist anders als meine. Wenn ich das Programm funktioniert verwenden putStrLn
wie erwartet (Print, dann prompt und Druck).
Ist es ein Fehler in ghc
, oder es ist die Art und Weise, dass es funktionieren soll?
Lösung
Das ist, weil GHCI deaktiviert Pufferung, während ein Programm mit ghc zusammengestellt Linie Pufferung standardmäßig hat. Sie können dies sehen dies durch Ausführen von:
import System.IO
main = print =<< hGetBuffering stdout
In GHCi Sie NoBuffering
sehen, während mit runghc Sie LineBuffering
bekommen. Da das Newline-Zeichen wird nicht gedruckt, bis nach der Benutzereingabe, die Aufforderung auch nicht.
Fix it von hFlush stdout
nach der Aufforderung des Hinzufügen (oder deaktivieren Pufferung mit hSetBuffering stdout NoBuffering
, aber das ist wahrscheinlich schlecht).