This question already has answers here:
IO happens out of order when using getLine and putStr
(3个答案)
5年前关闭。
我在已编译的Haskell代码中遇到了IO的奇怪行为。这是怎么回事:
我通过调用
为了澄清,我希望它按以下顺序发生:
有人可以解释为什么会这样吗,以及如何按照我期望的方式对IO进行排序。
还要注意,我尝试将
(3个答案)
5年前关闭。
我在已编译的Haskell代码中遇到了IO的奇怪行为。这是怎么回事:
-- MyScript.hs
main = do
putStr "Enter your name: "
a <- getLine
putStrLn (a ++ " - that's a nice name!")
我通过调用
main
在GHCi中运行此程序,它按预期运行,首先打印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!
有人可以解释为什么会这样吗,以及如何按照我期望的方式对IO进行排序。
还要注意,我尝试将
do
语句的第一行更改为_ <- putStr "Enter your name: "
,但这仍然行不通。 最佳答案
IO操作以正确的顺序发生,问题在于输入和输出管道的工作方式。字符串"Enter your name: "
在putStr
之前由getLine
写入输出缓冲区,但是不一定刷新该缓冲区。在hFlush stdout
之后添加putStr
将刷新缓冲区。
import System.IO
-- MyScript.hs
main = do
putStr "Enter your name: "
hFlush stdout
a <- getLine
putStrLn (a ++ " - that's a nice name!")
10-02 14:30