GHCi与runhaskell在getLine功能上的差异

GHCi与runhaskell在getLine功能上的差异,haskell,io,ghci,runhaskell,Haskell,Io,Ghci,Runhaskell,我刚刚偶然发现了一件我不明白的事 如果我使用GHCi并使用getLine我会得到以下结果 Prelude> a <- getLine Test<Backspace>oo<CR> -- the Backspace action results in a '^?' Prelude> a "Test\DELoo" Prelude>a “测试\DELO” 如果我在Haskell文件中写入相同的 module Main where main :: IO ()

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

如果我使用GHCi并使用
getLine
我会得到以下结果

Prelude> a <- getLine
Test<Backspace>oo<CR> -- the Backspace action results in a '^?'
Prelude> a
"Test\DELoo"
Prelude>a
“测试\DELO”
如果我在Haskell文件中写入相同的

module Main where

main :: IO ()
main = do a <- getLine
          putStrLn a
modulemain其中
main::IO()

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

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

hSetBuffering stdin LineBuffering

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

你说我会
有很多不想要的副作用
,它们是否只是ghci中不需要的,或者在编译版本中是否有某种针对它的保护-您能详细说明一下吗?无论您是否这样做-我会尽快接受这个答案!它们在GHCi中是不需要的。它会扰乱GHCi本身读取输入的方式,因此当您输入要运行的GHCi的内容时,您只会在按下返回键时看到它们显示。那么,在GHCi中使用
getLine
时,有没有办法删除/修改您的输入?@JoshCaswell您是什么意思?行编辑,例如
haskeline
提供了什么?