错误的IO操作顺序使用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
一个错误,或者是它应该工作的方式?
解决方案
这是因为ghci中禁用缓冲,同时用GHC编译的程序默认具有行缓冲。您可以通过运行该看到这一点:
import System.IO
main = print =<< hGetBuffering stdout
在GHCI看到NoBuffering
而与runghc你LineBuffering
。由于换行字符不打印,直到后的用户输入时,提示没有任
您的提示后加入hFlush stdout
对其进行修复(或禁用缓存与hSetBuffering stdout NoBuffering
,但是这可能是坏的)。
不隶属于 StackOverflow