2012-08-12 41 views
8

我有一個很奇怪的問題。下面的代碼給出了不同的結果時相比,在ghci中運行編譯,GHCi和編譯好的代碼似乎行爲不一樣

main = do 
    putStr "Please enter your name: " 
    name <- getLine 
    putStr ("Hello, " ++ name ++ ", how are you?") 

當ghci中它爲人們所期望的運行它,

Please enter your name: dglmoore 
Hello, dglmoore, how are you? 

然而,當我的代碼編譯成可執行程序,它要求我公司提供的輸入產生任何輸出之前,所以我結束了這一點,

dglmoore 
Please enter your name: Hello, dglmoore, how are you? 

我以前見過類似的問題,但我似乎無法再找到它。

我使用Haskell平臺版本2012.2.0.0中的ghc版本7.4.1。

任何人都有任何想法,他們爲什麼會給出不同的結果,我怎麼能讓兩個版本做「正確」的事情?

回答

12

這是一個緩衝問題。除非您明確地清空緩衝區,否則通常IO會進行行緩衝(即輸出實際上不會顯示在屏幕上,除非您打印新行或超過緩衝區大小)。在ghci中不是,所以這個問題沒有出現。

在致電getLine之前,可以使用hFlush stdout來清除標準輸出,使輸出打印到屏幕上。

或者,您可以使用hSetBuffering NoBuffering來完全禁用緩衝區,不需要hFlush。儘管如此,這可能會對IO性能產生負面影響。

+0

哇,我一直在使用Haskell兩年的更好的一部分,從來沒有遇到過這個問題。這就像一個魅力。 – 2012-08-12 22:46:34

+3

@DougMoore請注意,在大多數編程語言中,終端輸出是行緩衝的 - 不僅僅是Haskell(儘管在某些語言中,讀取輸入會自動導致輸出被刷新,消除了這個錯誤源)。 – sepp2k 2012-08-12 22:48:42