2010-03-23 6 views
36

Ich habe den folgenden Code:Falsche IO Aktionen Reihenfolge mit putstr und getLine

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 wird Test input : asd nach asd gedruckt?

In dem Codebeispiel auf http://learnyouahaskell.com/, das ist anders als meine putStr, die getLine ‚s präsentiert Ausgang verwendet. Wenn ich putStrLn verwende, funktioniert das Programm wie erwartet (Drucken, dann Aufforderung und Drucken).

Ist es ein Fehler in ghc, oder es ist die Art, wie es funktionieren sollte?

Antwort

48

Dies liegt daran, dass ghci die Pufferung deaktiviert, während ein Programm, das mit ghc kompiliert wurde, standardmäßig eine Zeilenpufferung hat. Sie können dies sehen dies durch Ausführen von:

import IO 
main = print =<< hGetBuffering stdout 

In GHCI Sie NoBuffering sehen, während mit runghc Sie LineBuffering bekommen. Da das Zeilenumbruchszeichen erst nach nach die Benutzereingabe druckt, erfolgt die Eingabe ebenfalls nicht.

Fix es durch Hinzufügen hFlush stdout nach Ihrer Eingabeaufforderung (oder deaktivieren Sie die Pufferung mit hSetBuffering stdout NoBuffering, aber das ist wahrscheinlich schlecht).

+3

Sie müssen 'importieren System.IO' anstelle von' Import IO' –