GHCi和编译的代码似乎表现不同

时间:2012-08-12 22:36:18

标签: haskell io

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

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

1 个答案:

答案 0 :(得分:12)

这是一个缓冲问题。通常IO是行缓冲的(即,除非您显式刷新缓冲区,否则输出实际上不会显示在屏幕上,直到您打印新行或超过缓冲区大小)。在ghci它不是,所以问题不会出现。

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

或者,您可以使用hSetBuffering NoBuffering完全禁用缓存,从而无需hFlush。但这可能会对IO性能产生负面影响。