将IO输出收集到列表中

use*_*228 7 io monads haskell

如何SDL.pollEvent :: IO Event在输出结束之前发出多个调用SDL.NoEvent并将所有结果收集到列表中?

在命令性的术语中,这样的事情:

events = []
event = SDL.pollEvent
while ( event != SDL.NoEvent ) {
        events.add( event )
        event = SDL.pollEvent
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*ger 4

James Cook 非常友善地用这个函数扩展了monad-loop :

unfoldWhileM  :: Monad  m => (a -> Bool) -> m a -> m [a]
Run Code Online (Sandbox Code Playgroud)

与 SDL 一起使用:

events <- unfoldWhileM (/= SDL.NoEvent) SDL.pollEvent
Run Code Online (Sandbox Code Playgroud)