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

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

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

最佳答案

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

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

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

关于haskell - GHCi 和编译的代码似乎表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926398/

相关文章:

haskell - 除了模式之外,@在Haskell中还有什么意思?

haskell - 如何在 Haskell 中运行一系列操作(函数)?

Haskell—— pretty-print 列表的问题

haskell - 函数无法匹配类型

java - 如何实现可以倒带的 OutputStream?

java - 为什么 MappedByteBuffer 无法扩展?

java - 用 Java 保存对象

haskell - haskell中的相互递归类型

java urlconnection 不抛出 sockettimeoutexception

c++ - 如何让我的 C++ 程序更快地构建 Trie 结构?