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

Aad*_*hah 13 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]
Run Code Online (Sandbox Code Playgroud)

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

12
Enter the number of prime numbers to display: [2,3,5,7,11,13,17,19,23,29,31,37]
Run Code Online (Sandbox Code Playgroud)

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

JB.*_*JB. 23

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

hSetBuffering stdout NoBuffering -- from System.IO
Run Code Online (Sandbox Code Playgroud)

  • 通过平台我的意思更像是操作系统和终端.通常,stdin和stdout以一种方式"绑定",每当读取stdin时都会使stdout刷新,这正是为了避免这种问题.FWIW,你的问题在我的设置上正确缓冲和序列. (5认同)

Ada*_*fer 10

stdin并且stdout是两个不需要任何连接的不同文件.以Unix shell命令为例grep:

$ seq 1 100 | grep 2$ | less
Run Code Online (Sandbox Code Playgroud)

seq 1 100打印的数字1到100到其stdout它是grep小号stdin(|连接stdout一个命令到stdin一个其他的).grep然后写入给定正则表达式匹配到其的所有行stdoutless小号stdin.

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

 hFlush stdout
Run Code Online (Sandbox Code Playgroud)