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?

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top