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)
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |