realizar pedir pantalla nombre lea imprimir guardar espacios escribir escriba con completo como cadenas arreglo apellido algoritmo haskell io ghc buffering

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