在.hs文件中的另一个主函数内运行main函数会改变行为IO吗?

时间:2012-01-04 23:40:25

标签: haskell

我目前正在完成我的第一个Haskell项目,在工作的最后一步,我连接不同的haskell文件后,我的I / O功能似乎很奇怪。

我有一个主文件(f1.hs),它加载多媒体库的一些信息并将其保存到新的.hs文件(f2.hs)中的变量中。我还有一个“数据处理和用户界面”文件(f3.hs),它读取这些变量,并根据用户的订单,对它们进行排序并在屏幕上显示。这个f3.hs文件适用于菜单,由键盘输入的值(getLine)命令。

为了使工作序列“自动”,我在f1.hs文件上创建了一个“main”函数,它创建了f2.hs文件,然后使用System.Cmd模块,我做了一个{{1 }}。这将用户从f1.hs文件路由到f3.hs的主函数。

奇怪的是,在我这样做之后,所有system "runhaskell f3.hs"似乎都出现在函数提示的最后一行之前。

应该出现的是:

getLine

但我得到的是:

Question One.....
Answer: (cursor's place)

这只有在我运行runhaskell f1.hs时才会发生。如果我直接尝试Question One..... (cursor's place) Answer: ,它可以正常工作(虽然我不能在最后的工作上完成,因为需要首先创建f2.hs文件)。我对这个序列做错了吗?

我很抱歉缺乏代码,但我认为这对理解问题没有任何帮助......

1 个答案:

答案 0 :(得分:8)

这通常是由行缓冲引起的,这意味着在打印换行符之前,文本实际上不会打印到控制台。解决方案是手动刷新缓冲区,例如:

import System.IO

main = do ...
          putStr "Answer: "
          hFlush stdout
          ...

或者,您可以使用hSetBuffering stdout NoBuffering禁用缓冲,但这会带来轻微的性能损失,因此我建议您在需要打印部分线时手动进行刷新。