提示消息在编译的可执行文件中消失



我有一个Haskell程序,它显示一个提示,然后接受命令行的输入。我以的身份执行此操作

main = do putStr "Please enter program source file name: "
          programFileName <- getLine
          programFileHandle <- openFile programFileName ReadMode
          program <- hGetContents programFileHandle
          putStr "Please enter initial file configuration file name: "
          initConfigFileName <- getLine
          initConfigFileHandle <- openFile initConfigFileName ReadMode
          initConfigStr <- hGetContents initConfigFileHandle
          print (evaluateProgram (lines program) (readReg initConfigStr))

当我在GHCi解释器上运行它时,提示显示得很好,我可以输入我的输入(其他一切都正常)。

例如。*Main>Main请输入程序源文件名:sum.urm请输入初始文件配置文件名:sum.conf9

当我编译它时(在Mac OS X或Windows上),它会生成一个不显示提示的可执行文件。它等待两个输入字符串,然后一旦我输入了有效的文件名,它就会打印提示和结果。

例如

$ ./a.out 
sum.urm
sum.conf
Please enter program source file name: Please enter initial file configuration file name: 9

你知道为什么会这样吗?

出于好奇,我在Haskell中实现了一个无限注册机。

默认情况下,标准输出流stdout是行缓冲的。这意味着它只会在每次输出n字符时,或者在程序终止时写入控制台。可以通过导入System.IO并在每个末尾不包含nputStr之后执行hFlush stdout来解决此问题。

这是一个缓冲问题。以下是相关问题,有几种解决方案可供选择:

为什么不是';我的IO是否按顺序执行?

执行订单(>>=)不是我预期的