【问题标题】:Difference in getLine functionality with GHCi vs. runhaskellGHCi 与 runhaskell 的 getLine 功能差异
【发布时间】:2014-02-02 13:15:40
【问题描述】:

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

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

Prelude> a <- getLine
Test<Backspace>oo<CR> -- the Backspace action results in a '^?'
Prelude> a
"Test\DELoo"

如果我在 Haskell 文件中写 same

module Main where

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

并使用 runhaskell 运行脚本并输入相同的输入,退格键会按预期删除“t”。

为什么会有差异?

【问题讨论】:

    标签: haskell io ghci runhaskell


    【解决方案1】:

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

    hSetBuffering stdin NoBuffering
    

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

    hSetBuffering stdin LineBuffering
    

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

    【讨论】:

    • 你说我会have a lot of unwanted side effects,它们只是在 ghci 中不需要,还是在编译版本中有某种针对它的保护 - 你能详细说明一下吗?
    • 不管你是否接受 - 我会尽快接受这个答案!
    • 它们在 GHCi 中是不需要的。它会扰乱 GHCi 本身读取输入的方式,因此当您输入要运行 GHCi 的内容时,您只会在按下 Return 键后才能看到它们。
    • 那么有没有办法在 GHCi 中使用 getLine 时删除/修改您的输入?
    • @JoshCaswell 你是什么意思?行编辑,例如haskeline 提供?
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2020-05-27
    • 2018-01-06
    • 2011-11-05
    • 2015-10-19
    • 2016-03-16
    相关资源
    最近更新 更多