我只是偶然发现了一件我不明白的事。
如果我使用的是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运行脚本并输入相同的输入,backspace将按预期删除't‘。
为什么会有区别?
发布于 2014-01-14 13:08:01
这是由于不同的缓冲行为在GHCi和GHC。GHCi默认使用NoBuffering (标准输入流),而GHC编译的二进制文件/ runhaskell默认使用LineBuffering。如果你明确地
hSetBuffering stdin NoBuffering在您的Haskell程序中,您将能够再现GHCi行为。如果你这样做了
hSetBuffering stdin LineBuffering在GHCi中,您将有许多不必要的副作用,但可以再现runhaskell行为。
https://stackoverflow.com/questions/21114222
复制相似问题