2010-03-23 16 views
36

tengo el siguiente código:acciones IO orden equivocado utilizando putStr y getLine

main = do 
    putStr "Test input : " 
    content <- getLine 
    putStrLn content 

Cuando lo ejecuto (con runhaskell) o compilarlo (GHC 6.10.4) el resultado es la siguiente:

asd 
Test input : asd 

¿Por qué se imprime Test input : asd después de asd?

En el ejemplo de código en http://learnyouahaskell.com/, que usa putStr, la salida presentada de getLine es diferente a la mía. 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?

Respuesta

48

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. Se puede ver esto ejecutando el siguiente:

import IO 
main = print =<< hGetBuffering stdout 

En ghci que ver NoBuffering mientras que con runghc se obtiene 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 de su solicitud (o deshabilitar el almacenamiento en búfer con hSetBuffering stdout NoBuffering, pero eso probablemente sea malo).

+3

es posible que necesite 'import System.IO' en lugar de' import IO' –