Неверный порядок операций ввода-вывода с использованием putStr и getLine
У меня есть следующий код:
main = do
putStr "Test input : "
content <- getLine
putStrLn content
Когда я запустил его (с помощью runhaskell
) или скомпилировал его (ghc 6.10.4), результат будет таким:
asd
Test input : asd
Почему Test input : asd
печатается после asd
?
В образце кода http://learnyouahaskell.com/, который использует putStr
, представленный вывод getLine
отличается от моего. Когда я использую putStrLn
, программа работает как ожидалось (печать, затем запрос и печать).
Является ли это ошибкой в ghc
, или так оно и должно работать?
Ответы
Ответ 1
Это связано с тем, что ghci отключает буферизацию, тогда как программа, скомпилированная с помощью ghc, по умолчанию имеет буферизацию по умолчанию. Вы можете увидеть это, выполнив это:
import IO
main = print =<< hGetBuffering stdout
В ghci вы видите NoBuffering
, а при запуске вы получаете LineBuffering
. Поскольку символ новой строки не печатается до тех пор, пока после ввода пользователя, приглашение также не будет.
Исправьте его, добавив hFlush stdout
после вашего приглашения (или отключите буферизацию с помощью hSetBuffering stdout NoBuffering
, но это, вероятно, плохо).