我的一个朋友问我为什么要学习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操作?我哪里错了?
答案 0 :(得分:23)
这看起来更像是缓冲而不是排序问题。你在什么平台上?您是否尝试过强制无缓冲输出?
hSetBuffering stdout NoBuffering -- from System.IO
答案 1 :(得分:10)
stdin
和stdout
是两个不需要任何连接的不同文件。以此为例Unix shell命令grep
:
$ seq 1 100 | grep 2$ | less
seq 1 100
将数字1到100打印到stdout
,grep
s stdin
(|
连接一个命令的stdout
到另一个的stdin
。 grep
然后将与给定正则表达式匹配的行写入stdout
less
stdin
的{{1}}。
要强制stdout
(或任何其他文件),请使用hFlush
中的System.IO
:
hFlush stdout