首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的Haskell程序太懒了

我的Haskell程序太懒了
EN

Stack Overflow用户
提问于 2016-07-26 07:05:49
回答 1查看 162关注 0票数 7

我的职责是:

代码语言:javascript
复制
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的打印到控制台。

但是这个函数--只要稍加修改,就可以打印出控制台上的所有内容:

代码语言:javascript
复制
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工作?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-26 21:04:53

正如托马斯在评论中指出的那样,这看起来像是一个缓冲问题。System.IO包描述了标准的缓冲行为

关于如何解决这类问题,您有几个选择。您可以使用以下方法手动设置程序中的缓冲模式:

代码语言:javascript
复制
hSetBuffering stdout NoBuffering

在你开始工作的时候。这将关闭所有缓冲(您也可以选择LineBuffering),并将立即打印到stdout。

还可以在每次打印后刷新缓冲区:

代码语言:javascript
复制
SDL.MouseMotionEvent dat -> do
  liftIO $ putStrLn "HELLO"
  hFlush stdout

或者,您可以尝试直接打印到具有不同默认缓冲规则的stderr句柄:

代码语言:javascript
复制
SDL.MouseMotionEvent dat -> do
  liftIO $ hPutStrLn stderr "HELLO"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38583178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档