麻烦“getContents”

时间:2015-12-29 18:11:37

标签: haskell

我很难理解这是Prelude的getContents函数的问题还是设计特性。假设我们有以下代码,保存在名为“getContentsTest.hs”的文件中:

main = do
    contents <- getContents
    putStrLn contents

如果我现在(在我的Windows 10系统上),请使用

进行编译
ghc getContentsTest.hs

并运行生成的可执行文件,命令提示符拒绝确认输入。文本光标仍然闪烁,就好像它接受输入一样,但在我的(物理)键盘上键入不会在屏幕上产生任何内容。另外,发出CTRL-Z和CTRL-C命令不会停止程序,我必须关闭命令提示符才能停止程序。

但是,如果我只是运行

runhaskell getContentsTest.hs

它按预期工作(即它将输入打印到终端,如果遇到文件结束信号,程序停止,如CTRL-D,或者有人用CTRL-C中断程序)< / p>

为什么编译这个短程序会导致getContents函数表现不同?

更新

我无法在任何其他计算机上复制上述行为,因此我觉得这必须是我第一次尝试使用此计算机的特定内容。因此,现在这不再是Haskell特定的问题,而是更多的“为什么Windows命令提示符不应该表现得像”这样的问题。

我正在使用的机器的关键(错误)行为是,当我运行上述程序时,命令提示符基本上冻结,不接受输入。因此,感谢您对getContents的见解,但我觉得这个问题是我的PC需要解决的问题。

1 个答案:

答案 0 :(得分:4)

这个问题有点像常见问题 - 或根本原因是。

stdin和stdout是行缓冲的,因此在填充缓冲区或换行符之前,您不会看到任何内容。您可以使用hSetBuffering

关闭可能更符合您期望的行为的缓冲
import System.IO
main =
 do hSetBuffering stdin NoBuffering
    hSetBuffering stdout NoBuffering
    getContents >>= putStrLn

结束行为:

hheellllooww  wwoorrlldd

(是的,我输入&#39; hello world&#39;)