haskell - GHCi 与 runhaskell 的 getLine 功能差异

标签 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”。

为什么有区别?

最佳答案

这是由于 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/

相关文章:

haskell : display/get list of all user defined functions

haskell - 跟踪 ghci 中的主要功能

haskell - 了解 `evaluate` 功能

haskell - 如何使用 hpack 拥有多个库?

haskell - QuickCheck Gen 不是单子(monad)

c - 使用带有 SEEK_END 的 fopen_s() 和 fseek() 进行文件写入

file - Go WriteString 函数 panic ?

haskell - foldr1 的融合法则?

haskell - 在haskell中绑定(bind)计算的运行时间

java - jdk7 watch service API中,什么时候会抛出OVERFLOW事件?