[英]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.