GHCi与runhaskell的getLine功能差异



我刚刚偶然发现了一件我不明白的事情。

如果我正在使用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行为。

最新更新