2012-08-12 3 views
8

私は非常に奇妙な問題があります。 GHCiの中で実行されていると比較してコンパイルした場合、私はにコードをコンパイルするときに次のコードは、予想されるようにそれがないGHCiの中でそれを実行GHCiとコンパイルされたコードの動作が異なるようです。

main = do 
    putStr "Please enter your name: " 
    name <- getLine 
    putStr ("Hello, " ++ name ++ ", how are you?") 

、しかし

Please enter your name: dglmoore 
Hello, dglmoore, how are you? 

、異なる結果を与えます

dglmoore 
Please enter your name: Hello, dglmoore, how are you? 

、それは私がすべての出力が生成される前に、私はこれで終わるの入力を提供する必要が実行可能私は前に同様の問題を見てきましたが、私は再びそれを見つけるように見えることはできません。

私は、Haskell Platformバージョン2012.2.0.0のghcバージョン7.4.1を使用しています。

誰かが異なる結果を出す理由と「正しい」ことを行うために両方のバージョンを取得する方法を知っていますか?

答えて

12

これはバッファリングの問題です。通常、バッファを明示的にフラッシュしない限り、IOはラインバッファされます(つまり、新しい行を印刷するか、バッファサイズを超えるまで、出力は実際に画面に表示されません)。 ghciではそうではないので、問題は表示されません。

hFlush stdoutを使用して、getLineを呼び出す前に、標準出力をフラッシュして出力を画面に表示させることができます。

hSetBuffering NoBufferingを使用すると、バッファリングを完全に無効にして、hFlushの必要性を取り除くことができます。しかし、それはIOパフォーマンスに悪影響を及ぼす可能性があります。

+0

うわー、私はハスケルを2年間使ったことがありますが、これまでに問題に遭遇したことはありません。それは魅力のように働いた。 –

+3

@DougMoore Haskellだけではなく、大部分のプログラミング言語で端末出力がラインバッファリングされていることに注意してください(一部の言語では入力を読み込むと自動的に出力がフラッシュされ、このエラーの原因は取り除かれます)。 – sepp2k

関連する問題