我有一个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))
Run Code Online (Sandbox Code Playgroud)
当我在GHCi解释器上运行它时,提示显示正常,我能够输入我的输入(以及其他所有工作).
例如*Main> main请输入程序源文件名:sum.urm请输入初始文件配置文件名:sum.conf 9
当我编译它时(在Mac OS X或Windows上),它会生成一个不显示我的提示的可执行文件.它等待两个输入字符串,然后一旦我输入了有效的文件名,它就会输出提示和结果.
例如
$ ./a.out
sum.urm
sum.conf
Please enter program source file name: Please enter initial file configuration file name: 9
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?
好奇的是,我在Haskell中实现了一个无限注册机器.
stdout默认情况下,标准输出流是行缓冲的.这意味着它只会在每次输出\n字符时写入控制台,或者最终在程序终止时写入控制台.您可以通过导入System.IO并hFlush stdout在每个putStr不包含\n最后的内容之后执行此操作来解决此问题.