41

次のコードがあります。

main = do
    putStr "Test input : "
    content <- getLine
    putStrLn content

それを ( で) 実行するrunhaskellか、(ghc 6.10.4 で) コンパイルすると、結果は次のようになります。

asd
Test input : asd

Test input : asdの後に印刷されるのはなぜasdですか?

を使用するhttp://learnyouahaskell.com/のコード サンプルではputStrgetLine​​表示される出力が私のものとは異なります。プログラムを使用するとputStrLn、期待どおりに動作します(印刷、プロンプト、印刷)。

のバグghcですか、それとも動作するはずの方法ですか?

4

1 に答える 1

55

これは、ghci がバッファリングを無効にするのに対し、ghc でコンパイルされたプログラムにはデフォルトで行バッファリングがあるためです。これを実行すると、次のように表示されます。

import System.IO
main = print =<< hGetBuffering stdout

ghci ではNoBuffering、runghc では が表示されますLineBuffering。改行文字はユーザーが入力するまで出力されないため、プロンプトも出力されません

プロンプトの後に追加して修正しhFlush stdoutます(または でバッファリングを無効にしますhSetBuffering stdout NoBufferingが、それはおそらく悪いことです)。

于 2010-03-23T14:09:48.457 に答える