2016-07-26 20 views
7

が面倒です。私のHaskellのプログラムは、私のような機能を持っている

この機能は一見しても発火しません。putStrLnのいずれもコンソールに出力しないためです。なぜ、周囲のputStrLn年代原因SDL.EventPayloadの完全な評価が動作するん

onEvent :: SDL.EventPayload -> App() 
onEvent event = do 
    liftIO $ putStrLn "EVE!" 
    case event of 
    SDL.MouseMotionEvent dat -> do 
     liftIO $ print dat 
    SDL.KeyboardEvent kbe -> liftIO $ print kbe 
    _ -> return() 

: -

しかし、この機能を若干の修正とは、コンソールにすべてを印刷していますか?

私の関数コールバックをもう少し信頼できるものにするにはどうすればよいですか?

+6

あなたは必ずこのISNですバッファリングの問題?代わりに 'hPutStrLn stderr'を試してください。 –

+0

@ ThomasM.DuBuissonはい、ちょうどバッファリングの問題です!今私は愚かなような気がする... –

+0

バー、気分は馬鹿。公正な質問です。うれしいことが働いています。 –

答えて

1

Thomasはコメントに指摘されているように、これはバッファリングの問題のようです。 System.IOパッケージには、標準buffering behaviorが記載されています。

この種の問題を解決するには、いくつかの選択肢があります。プログラムでバッファリングモードを手動で設定するには、機能の開始時に

hSetBuffering stdout NoBuffering 

と入力します。これによりすべてのバッファリングがオフになります(LineBufferingも選択できます)。すぐにstdoutに出力されます。

また、すべての印刷後にバッファをフラッシュできます。

SDL.MouseMotionEvent dat -> do 
    liftIO $ putStrLn "HELLO" 
    hFlush stdout 

それとも、別のデフォルトのバッファリングのルールを持っているstderrハンドルに直接印刷しようとすることができます

SDL.MouseMotionEvent dat -> do 
    liftIO $ hPutStrLn stderr "HELLO" 
関連する問題