Я встречаю странное поведение с IO в рамках скомпилированного кода Haskell. Вот что происходит:Haskell Скомпилированный порядок ввода-вывода и промывка
-- MyScript.hs
main = do
putStr "Enter your name: "
a <- getLine
putStrLn (a ++ " - that's a nice name!")
я запускаю это в GHCi по телефону main
и он работает, как и следовало ожидать, первая печать Enter your name:
, а затем делать все это делать потом. Однако, когда я скомпилировать его с GHC (с и без --make
), он первым предлагает ввести строку, и затем печатает все сразу, как это:
$ ./MyScript
Jimmy Johnson
Enter your name: Jimmy Johnson - That's a nice name!
Чтобы уточнить, я хочу, чтобы иметь место в в следующей последовательности:
$ ./MyFixedScript
Enter your name: Jimmy Johnson
Jimmy Johnson - That's a nice name!
Может кто-нибудь объяснить, почему это происходит, как это, и как последовательность ввода-вывода так, что я бы ожидать его.
Обратите внимание, что я попытался изменить первую строку инструкции do
на _ <- putStr "Enter your name: "
, но это все еще не работает.
Это связано с буферизацией, не упорядочивающей действия io. – sabauma