2010-03-23 75 views
36

我有以下代碼:錯誤IO動作順序使用putStr和函數getline

main = do 
    putStr "Test input : " 
    content <- getLine 
    putStrLn content 

當我運行它(與runhaskell)或編譯(GHC 6.10.4)的結果是這樣的:

asd 
Test input : asd 

爲什麼在asd之後打印Test input : asd

http://learnyouahaskell.com/的代碼示例中,它使用putStrgetLine的輸出結果與我的不同。當我使用putStrLn時,程序按預期工作(打印,然後提示和打印)。

它是ghc中的錯誤,還是它應該工作的方式?

回答

48

這是因爲ghci禁用緩衝,而使用ghc編譯的程序默認具有行緩衝。您可以通過運行此看到:

import IO 
main = print =<< hGetBuffering stdout 

在ghci中看到NoBuffering而與runghc你LineBuffering。由於換行符不能打印,直到用戶輸入,提示符也不會。

在提示後添加hFlush stdout(或者使用hSetBuffering stdout NoBuffering禁用緩衝,但可能不好),修復此問題。

+3

你可能需要'import System.IO'而不是'import IO' – 2015-11-26 12:54:36