GHCi和编译代码的行为似乎不同 [英] GHCi and compiled code seem to behave differently
本文介绍了GHCi和编译代码的行为似乎不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个非常奇怪的问题。与在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是行缓冲的(即,除非您显式刷新缓冲区,否则输出不会实际显示在屏幕上,直到您打印新行或超出缓冲区大小)。在GRCI中不是,所以问题不会出现。
您可以在调用getLine
之前使用hFlush stdout
刷新标准输出,使输出打印到屏幕上。
hSetBuffering NoBuffering
完全禁用缓冲,从而不再需要hFlush
。不过,这可能会对IO性能产生负面影响。
这篇关于GHCi和编译代码的行为似乎不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文