Niewłaściwa kolejność działań IO przy użyciu putStr i getLine

Mam następujący kod:

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

Kiedy uruchamiam go (z runhaskell) lub kompiluję (ghc 6.10.4) wynik jest taki:

asd
Test input : asd

Dlaczego Test input : asd jest drukowane po asd?

W kodzie próbki na http://learnyouahaskell.com / , który wykorzystuje putStr, prezentowany wynik getLine jest inny niż mój. Kiedy używam putStrLn program działa zgodnie z oczekiwaniami(print, następnie prompt i print).

Czy jest to błąd w ghc, czy jest to sposób, w jaki powinien praca?

Author: nbro, 2010-03-23

1 answers

Dzieje się tak dlatego, że ghci wyłącza buforowanie, podczas gdy program skompilowany z ghc domyślnie ma buforowanie linii. Możesz to zobaczyć uruchamiając to:

import System.IO
main = print =<< hGetBuffering stdout

W ghci widzisz NoBuffering podczas gdy z runghc dostajesz LineBuffering. Ponieważ znak nowej linii nie jest drukowany przed po wprowadzonym przez użytkownika, znak zachęty również nie jest drukowany.

Napraw to, dodając hFlush stdout po monicie (lub wyłącz buforowanie za pomocą hSetBuffering stdout NoBuffering, ale to prawdopodobnie źle).

 51
Author: Josh Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-29 16:37:17