Wie kann ich mehrere Anrufe an SDL.pollEvent :: IO Event
bis die Ausgabe SDL.NoEvent
Ausgabe und sammeln Sie alle Ergebnisse in eine Liste?Sammeln von IO-Ausgaben in Liste
In Imperativ Begriffe etwas wie folgt aus:
import Control.Monad.ListT (ListT)
import Control.Monad.Trans.Class (lift) -- transformers, not mtl
import Data.List.Class (takeWhile, repeat, toList)
import Prelude hiding (takeWhile, repeat)
getEvents :: IO [Event]
getEvents =
toList . takeWhile (/= NoEvent) $ do
repeat()
lift pollEvent :: ListT IO Event
ListT
aus der "Liste" -Paket auf Hackage:
events = []
event = SDL.pollEvent
while (event != SDL.NoEvent) {
events.add(event)
event = SDL.pollEvent
}
Warum "repeat()"? – Peaker
@peaker: 'repeat() :: ListT IO()' ist eine unendliche IO-monadische Liste mit Werten, die keine Rolle spielen ('()'). dann '' '' '' 'mit pollEvent', so dass wir für jedes Element der unendlichen Liste' pollEvent'. 'takeWhile' macht es zu einer endlichen monadischen Liste und dann macht 'toList' es' :: IO [Event] '. – yairchu
Das scheint ein bisschen komisch. Vielleicht macht es mehr Sinn, etwas wie "repeatM (lift pollEvent)" zu verwenden? – Peaker