Подтвердить что ты не робот

Неверный порядок операций ввода-вывода с использованием 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, или так оно и должно работать?

4b9b3361

Ответ 1

Это связано с тем, что ghci отключает буферизацию, тогда как программа, скомпилированная с помощью ghc, по умолчанию имеет буферизацию по умолчанию. Вы можете увидеть это, выполнив это:

import IO
main = print =<< hGetBuffering stdout

В ghci вы видите NoBuffering, а при запуске вы получаете LineBuffering. Поскольку символ новой строки не печатается до тех пор, пока после ввода пользователя, приглашение также не будет.

Исправьте его, добавив hFlush stdout после вашего приглашения (или отключите буферизацию с помощью hSetBuffering stdout NoBuffering, но это, вероятно, плохо).