18

我刚刚偶然发现了一个我不明白的东西。

如果我使用 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”。

为什么有区别?

4

1 回答 1

23

这是由于 GHCi 和 GHC 中不同的缓冲行为。GHCi 默认使用标准输入(标准输入流),默认使用GHCNoBuffering编译的二进制文件。如果你明确地这样做runhaskellLineBuffering

hSetBuffering stdin NoBuffering

在您的 Haskell 程序中,您将能够重现 GHCi 行为。如果你这样做

hSetBuffering stdin LineBuffering

在 GHCi 中,您会有很多不需要的副作用,但可以重现该runhaskell行为。

于 2014-01-14T13:08:01.127 回答