8

我有一个非常奇怪的问题。与在 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。

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

4

1 回答 1

14

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

hFlush stdout调用getLine.

或者,您可以使用hSetBuffering NoBuffering完全禁用缓冲,无需hFlush. 不过,这可能会对 IO 性能产生负面影响。

于 2012-08-12T22:39:30.250 回答