将IO输出收集到列表中 [英] Collecting IO outputs into list

查看:96
本文介绍了将IO输出收集到列表中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何向 SDL.pollEvent :: IO Event ,直到输出为 SDL.NoEvent 并将所有结果收集到列表中?



在命令式中,像这样:

<$ p $(事件!= SDL.NoEvent){
events.add(事件)
事件= [code>事件= []
事件= SDL.pollEvent
事件= SDL.pollEvent
}


解决方案

James库克非常友善,可以扩展 monad-loop s带有这个函数:

  unfoldWhileM :: Monad m => (a  - > Bool) - > m a  - > m [a] 

与SDL一起使用:

  events<  -  unfoldWhileM(/ = SDL.NoEvent)SDL.pollEvent 


How can I issue multiple calls to SDL.pollEvent :: IO Event until the output is SDL.NoEvent and collect all the results into a list?

In imperative terms something like this:

events = []
event = SDL.pollEvent
while ( event != SDL.NoEvent ) {
        events.add( event )
        event = SDL.pollEvent
}

解决方案

James Cook was so kind to extend monad-loops with this function:

unfoldWhileM  :: Monad  m => (a -> Bool) -> m a -> m [a]

used with SDL:

events <- unfoldWhileM (/= SDL.NoEvent) SDL.pollEvent

这篇关于将IO输出收集到列表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆