Les mauvaises actions IO ordre à l'aide putStr et getLine
Question
Je le code suivant:
main = do
putStr "Test input : "
content <- getLine
putStrLn content
Quand je lance (avec runhaskell
) ou le compiler (GHC 6.10.4) le résultat est comme ceci:
asd
Test input : asd
Pourquoi est-Test input : asd
en cours d'impression après asd
?
Dans l'exemple de code sur http://learnyouahaskell.com/ , qui utilise putStr
, la production présentée du getLine
est différente de la mienne. Lorsque j'utilise putStrLn
le programme fonctionne comme prévu (impression, puis rapide et impression).
Est-ce un bogue dans ghc
, ou il est la façon dont il devrait fonctionner?
La solution
Ceci est parce que ghci désactive en mémoire tampon, alors qu'un programme compilé avec GHC a mise en mémoire tampon de ligne par défaut. Vous pouvez voir cela en exécutant ceci:
import System.IO
main = print =<< hGetBuffering stdout
Dans ghci vous voyez NoBuffering
tout avec runghc vous obtenez LineBuffering
. Étant donné que le caractère de nouvelle ligne n'imprime pas jusqu'à ce que après l'entrée utilisateur, l'invite ne pas non plus.
Fix en ajoutant hFlush stdout
après votre message (ou désactiver tampon avec hSetBuffering stdout NoBuffering
, mais c'est probablement mauvais).