gpt4 book ai didi

haskell - 我的 Haskell 程序太懒了

转载 作者:行者123 更新时间:2023-12-04 12:52:31 42 4
gpt4 key购买 nike

我有一个类似的功能:

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上类了吗?

如何使我的函数回调更可靠一些?

最佳答案

Thomas在评论中指出,这看起来像是一个缓冲问题。 System.IO包装描述标准 buffering behavior .

对于如何解决此类问题,您有几种选择。您可以在程序中手动设置缓冲模式:

hSetBuffering stdout NoBuffering

在您的功能开始时。这将关闭所有缓冲(您也可以选择 LineBuffering )并立即打印到标准输出。

您还可以在每次打印后刷新缓冲区:
SDL.MouseMotionEvent dat -> do
liftIO $ putStrLn "HELLO"
hFlush stdout

或者您可以尝试直接打印到 stderr具有不同默认缓冲规则的句柄:
SDL.MouseMotionEvent dat -> do
liftIO $ hPutStrLn stderr "HELLO"

关于haskell - 我的 Haskell 程序太懒了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38583178/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com