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