2016-07-26 5 views
7

Ich habe eine Funktion wie:Mein Haskell-Programm ist zu faul

type App a = ExceptT AppError (ResourceT IO) 

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

Das ist ein Rückruf in meiner Anwendung verwendet wird.

Diese Funktion scheint nicht, weil keiner der putStrLn auf Konsole drucken.

Aber diese Funktion - mit der leichten Modifikation alles tut drucken zu trösten:

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() 

Warum wird die vollständige Bewertung von SDL.EventPayload Ursache der umliegenden putStrLn ‚s zu arbeiten?

Wie kann ich meine Funktion Callback ein wenig zuverlässiger machen?

+6

Sind Sie sicher, dass diese isn Ist das nicht nur ein Pufferproblem? Versuchen Sie stattdessen 'hPutStrLn stderr'. –

+0

@ ThomasM.DuBuisson Ja, es ist nur ein Pufferproblem! jetzt fühle ich mich irgendwie dumm ... –

+0

Bah, kein Gefühl dumm. Es ist eine faire Frage. Fröhliche Dinge funktionieren. –

Antwort

1

Wie Thomas in den Kommentaren darauf hingewiesen, sieht dies wie ein Pufferproblem aus. Das System.IO-Paket beschreibt den Standard buffering behavior.

Sie haben ein paar Möglichkeiten, wie Sie dieses Problem lösen können. Sie können den Puffermodus in Ihrem Programm manuell einstellen mit:

hSetBuffering stdout NoBuffering 

am Anfang Ihrer Funktion. Dies wird alle Pufferung ausschalten (Sie könnten auch LineBuffering wählen) und wird sofort auf stdout drucken.

Sie könnten auch den Puffer nach jedem Druck bündig:

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

Oder Sie können versuchen, direkt mit dem stderr Griff zu drucken, die Regeln andere Standard Pufferung hat:

SDL.MouseMotionEvent dat -> do 
    liftIO $ hPutStrLn stderr "HELLO"