【问题标题】:GHCi and compiled code seem to behave differentlyGHCi 和编译后的代码似乎表现不同
【发布时间】:2012-08-09 05:10:38
【问题描述】:

我有一个很奇怪的问题。与在 ghci 中运行相比,以下代码在编译时给出了不同的结果,

main = do
  putStr "Please enter your name: "
  name <- getLine
  putStr ("Hello, " ++ name ++ ", how are you?")

当在 ghci 中运行它时,它会按预期运行,

Please enter your name: dglmoore
Hello, dglmoore, how are you?

但是,当我将代码编译为可执行文件时,它要求我在生成任何输出之前提供输入,所以我最终得到了这个,

dglmoore
Please enter your name: Hello, dglmoore, how are you?

我以前见过类似的问题,但我似乎无法再次找到它。

我正在使用来自 Haskell 平台版本 2012.2.0.0 的 ghc 版本 7.4.1。

任何人都知道他们为什么给出不同的结果以及我如何让两个版本都做“正确”的事情?

【问题讨论】:

    标签: haskell io


    【解决方案1】:

    这是一个缓冲问题。通常 IO 是行缓冲的(即在您打印新行或超出缓冲区大小之前,输出实际上不会显示在屏幕上),除非您明确刷新缓冲区。在 ghci 中它不是,所以问题没有出现。

    您可以在调用getLine 之前使用hFlush stdout 刷新标准输出,从而将输出打印到屏幕上。

    您也可以使用hSetBuffering NoBuffering 完全禁用缓冲,从而不再需要hFlush。不过,这可能会对 IO 性能产生负面影响。

    【讨论】:

    • 哇,我已经使用 Haskell 两年了,以前从未遇到过这个问题。这就像一个魅力。
    • @DougMoore 请注意,在大多数编程语言中,终端输出都是行缓冲的——不仅仅是 Haskell(尽管在某些语言中,读取输入会自动导致输出被刷新,删除这个源错误)。
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多