getLine功能与GHCi与runhaskell的区别

时间:2014-01-14 13:00:28

标签: haskell io ghci runhaskell

我偶然发现了一件我不理解的事情。

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

为什么会有区别?

1 个答案:

答案 0 :(得分:22)

这是由于GHCi和GHC中的缓冲行为不同。 GHCi默认使用NoBuffering生成stdin(标准输入流),GHC编译的二进制文件/ runhaskell默认使用LineBuffering。如果你明确地做了

hSetBuffering stdin NoBuffering

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

hSetBuffering stdin LineBuffering

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