15

友人から、なぜ 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 アクションを正しく順序付けしないのはなぜですか? どこが間違っていますか?

4

2 に答える 2

11

stdinstdoutは、接続する必要のない 2 つの異なるファイルです。Unix シェルコマンドを例にとりgrepます:

$ seq 1 100 | grep 2$ | less

seq 1 1001 から 100 までの数字をstdoutsgrepに出力しますstdin(あるコマンドの を別のコマンドの に|接続します)。次に、指定された正規表現に一致する行をsに書き込みます。stdoutstdingrepstdoutlessstdin

stdout(または他のファイル)を強制的に書き込むには、 from を使用hFlushSystem.IOます。

 hFlush stdout
于 2013-10-22T18:45:31.477 に答える