为什么Haskell没有正确地对这些IO操作进行排序?

时间:2013-10-22 09:13:39

标签: haskell

我的一个朋友问我为什么要学习Haskell。为了演示Haskell的强大功能,我编写了一个小程序,显示了一个素数列表:

main = do
    putStr "Enter the number of prime numbers to display: "
    number <- fmap read getLine :: IO Int
    print . take number . filter isPrime $ [2..]

isPrime :: Integer -> Bool
isPrime n = not . any ((== 0) . mod n) $ [2..floor . sqrt . fromInteger $ n]

该程序按预期工作,除了轻微的异常。它在从用户获取输入编号后打印提示消息,从而产生如下输出:

12
Enter the number of prime numbers to display: [2,3,5,7,11,13,17,19,23,29,31,37]

为什么Haskell没有正确排序IO操作?我哪里错了?

2 个答案:

答案 0 :(得分:23)

这看起来更像是缓冲而不是排序问题。你在什么平台上?您是否尝试过强制无缓冲输出?

hSetBuffering stdout NoBuffering -- from System.IO

答案 1 :(得分:10)

stdinstdout是两个不需要任何连接的不同文件。以此为例Unix shell命令grep

$ seq 1 100 | grep 2$ | less

seq 1 100将数字1到100打印到stdoutgrep s stdin|连接一个命令的stdout到另一个的stdingrep然后将与给定正则表达式匹配的行写入stdout less stdin的{​​{1}}。

要强制stdout(或任何其他文件),请使用hFlush中的System.IO

 hFlush stdout