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