GHCi和编译代码的行为似乎不同 [英] GHCi and compiled code seem to behave differently

查看:22
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆