我偶然发现了一件我不理解的事情。
如果我使用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'。
为什么会有区别?
答案 0 :(得分:22)
这是由于GHCi和GHC中的缓冲行为不同。 GHCi默认使用NoBuffering
生成stdin(标准输入流),GHC编译的二进制文件/ runhaskell
默认使用LineBuffering
。如果你明确地做了
hSetBuffering stdin NoBuffering
在您的Haskell程序中,您将能够重现GHCi行为。如果你这样做
hSetBuffering stdin LineBuffering
在GHCi中,你会有很多不必要的副作用,但可以重现runhaskell
行为。