我刚刚偶然发现了一个我不明白的东西。
如果我使用 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”。
为什么有区别?
最佳答案
这是由于 GHCi 和 GHC 中不同的缓冲行为。 GHCi 具有使用 NoBuffering
的标准输入(标准输入流)默认情况下,GHC 编译的二进制文件/runhaskell
使用 LineBuffering
默认。如果你明确地这样做
hSetBuffering stdin NoBuffering
在您的 Haskell 程序中,您将能够重现 GHCi 行为。如果你这样做
hSetBuffering stdin LineBuffering
在 GHCi 中,您会有很多不需要的副作用,但可以重现
runhaskell
行为。
关于haskell - GHCi 与 runhaskell 的 getLine 功能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21114222/