Haskell编译了IO-Action命令和Flushing

AJF*_*mar 4 io monads haskell stdout

我在编译的Haskell代码中遇到了IO的奇怪行为.这是发生了什么:

-- MyScript.hs
main = do
    putStr "Enter your name: "
    a <- getLine
    putStrLn (a ++ " - that's a nice name!")
Run Code Online (Sandbox Code Playgroud)

我通过调用在GHCi中运行main它,它可以像预期的那样工作,首先打印Enter your name:然后做任何事情.但是,当我使用GHC(使用和不使用--make)编译它时,它首先提示输入一行,然后一次打印所有内容,如下所示:

$ ./MyScript
Jimmy Johnson
Enter your name: Jimmy Johnson - That's a nice name!
Run Code Online (Sandbox Code Playgroud)

为了澄清,我希望它按以下顺序发生:

$ ./MyFixedScript
Enter your name: Jimmy Johnson
Jimmy Johnson - That's a nice name!
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会发生这种情况,以及如何按照我期望的方式对IO进行排序.

另请注意,我已尝试将do语句的第一行更改为_ <- putStr "Enter your name: ",但仍然无效.

Cir*_*dec 12

IO操作以正确的顺序发生,问题在于输入和输出管道的工作方式.字符串在之前"Enter your name: "写入输出缓冲区,但缓冲区未必被刷新.在刷新缓冲区后添加.putStrgetLinehFlush stdoutputStr

import System.IO

-- MyScript.hs
main = do
    putStr "Enter your name: "
    hFlush stdout
    a <- getLine
    putStrLn (a ++ " - that's a nice name!")
Run Code Online (Sandbox Code Playgroud)