haskell - pedir - Orden de acciones IO incorrectas utilizando putStr y getLine
pedir nombre en c++ (1)
Tengo el siguiente código:
main = do
putStr "Test input : "
content <- getLine
putStrLn content
Cuando lo ejecuto (con runhaskell
) o lo compilo (ghc 6.10.4) el resultado es el siguiente:
asd
Test input : asd
¿Por qué la Test input : asd
se imprime después de asd
?
En el ejemplo de código en http://learnyouahaskell.com/ , que usa putStr
, el getLine
presentado por getLine
es diferente al mío. Cuando uso putStrLn
el programa funciona como se espera (imprima, luego solicite e imprima).
¿Es un error en ghc
, o es la forma en que debería funcionar?
Esto se debe a que ghci deshabilita el almacenamiento en búfer, mientras que un programa compilado con ghc tiene memoria de línea por defecto. Puedes ver esto ejecutando esto:
import System.IO
main = print =<< hGetBuffering stdout
En ghci ves NoBuffering
mientras que con runghc obtienes LineBuffering
. Como el carácter de nueva línea no se imprime hasta después de la entrada del usuario, el aviso tampoco.
Solucionarlo agregando hFlush stdout
después del aviso (o deshabilitar el almacenamiento en búfer con hSetBuffering stdout NoBuffering
, pero probablemente sea malo).