【发布时间】:2015-02-04 02:56:53
【问题描述】:
我在已编译的 Haskell 代码中遇到了 IO 的奇怪行为。这是发生了什么:
-- MyScript.hs
main = do
putStr "Enter your name: "
a <- getLine
putStrLn (a ++ " - that's a nice name!")
我通过调用main 在 GHCi 中运行它,它可以按预期工作,首先打印Enter your name:,然后再做任何事情。然而,当我用 GHC 编译它(有和没有--make)时,它首先提示输入一行,然后 然后 立即打印所有内容,如下所示:
$ ./MyScript
Jimmy Johnson
Enter your name: Jimmy Johnson - That's a nice name!
为了澄清,我希望它按以下顺序发生:
$ ./MyFixedScript
Enter your name: Jimmy Johnson
Jimmy Johnson - That's a nice name!
有人可以解释为什么会这样,以及如何按照我期望的方式对 IO 进行排序。
另请注意,我已尝试将do 语句的第一行更改为_ <- putStr "Enter your name: ",但这仍然不起作用。
【问题讨论】:
-
这是由于缓冲而不是 io 操作的排序。