2014-01-14 45 views
14

我剛剛偶然發現了一個我不明白的東西。GHCi與runhaskell的getLine功能區別

如果我使用GHCI和使用getLine我得到以下

Prelude> a <- getLine 
Test<Backspace>oo<CR> -- the Backspace action results in a '^?' 
Prelude> a 
"Test\DELoo" 

如果我在一個Haskell寫相同文件

module Main where 

main :: IO() 
main = do a <- getLine 
      putStrLn a 

與runhaskell運行腳本並進入相同的輸入,退格按預期刪除't'。

爲什麼會有差異?

回答

20

這是由於GHCi和GHC中不同的緩衝行爲。 GHCi默認使用NoBuffering stdin(標準輸入流),GHC編譯的二進制文件/ runhaskell默認使用LineBuffering。如果你明確地做

hSetBuffering stdin NoBuffering 

在你的Haskell程序,你就可以重現GHCI行爲。如果你在做GHCI

hSetBuffering stdin LineBuffering 

,你就會有很多不必要的副作用,但可重現runhaskell行爲。

+1

你說我會有很多不需要的副作用,他們只是在ghci中不需要的,或者是否在編譯版本中存在對它的某種保護 - 你能詳細說明一下嗎? – epsilonhalbe

+0

無論你是否願意 - 我會盡快接受這個答案! – epsilonhalbe

+2

它們在GHCi中是不需要的。它會混淆GHCi本身讀取輸入的方式,所以當你輸入GHCi運行的內容時,只有當你點擊返回鍵時纔會看到它們。 – kosmikus