我刚刚偶然发现了一件我不明白的事情。
如果我正在使用GHCi并使用getLine
我会得到以下内容
Prelude> a <- getLine
Test<Backspace>oo<CR> -- the Backspace action results in a '^?'
Prelude> a
"TestDELoo"
如果我在 Haskell 文件中写同样的东西
module Main where
main :: IO ()
main = do a <- getLine
putStrLn a
并使用 runhaskell 运行脚本并输入相同的输入,退格键会按预期删除"t"。
为什么会有区别?
这是
由于GHCi和GHC中的缓冲行为不同。GHCi 默认使用 NoBuffering
的 stdin(标准输入流),默认情况下使用 GHC 编译的二进制文件/runhaskell
使用 LineBuffering
。如果您明确执行
hSetBuffering stdin NoBuffering
在您的Haskell程序中,您将能够重现GHCi行为。如果你这样做
hSetBuffering stdin LineBuffering
在GHCi中,你会有很多不需要的副作用,但可以重现runhaskell
行为。