簡體   English   中英

我的Haskell程序太懶了

[英]My Haskell program is too lazy

我有一個功能:

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

這是我的應用程序中使用的回調。

這個函數看似不會觸發,因為沒有putStrLn的打印到控制台。

但是這個功能 - 稍作修改就可以將所有內容打印到控制台:

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

為什么SDL.EventPayload的完整評估會導致周圍的putStrLn工作?

如何使我的函數回調更可靠?

正如托馬斯在評論中指出的那樣,這看起來像是一個緩沖問題。 System.IO包描述了標准緩沖行為

關於如何解決此類問題,您有幾種選擇。 您可以使用以下方法在程序中手動設置緩沖模式:

hSetBuffering stdout NoBuffering

在你的功能開始。 這將關閉所有緩沖(您也可以選擇LineBuffering )並立即打印到stdout。

您還可以在每次打印后刷新緩沖區:

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

或者您可以嘗試直接打印到具有不同默認緩沖規則的stderr句柄:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM