8

私は非常に奇妙な問題を抱えています。次のコードは、ghciで実行する場合と比較して、コンパイルすると異なる結果をもたらします。

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

ghciで実行すると、予想どおりに実行されます。

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

ただし、コードを実行可能ファイルにコンパイルする場合、出力が生成される前に入力を提供する必要があるため、最終的には次のようになります。

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

私は以前に同様の問題を見たことがありますが、私はそれを再び見つけることができないようです。

Haskellプラットフォームバージョン2012.2.0.0のghcバージョン7.4.1を使用しています。

なぜそれらが異なる結果をもたらすのか、そしてどうすれば両方のバージョンに「正しい」ことをさせることができるのか、誰かが知っていますか?

4

1 に答える 1

14

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

hFlush stdoutを呼び出す前に、stdoutをフラッシュして、出力を画面に出力するために使用できますgetLine

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

于 2012-08-12T22:39:30.250 に答える