आप monadic सूचियों का उपयोग कर सकते हैं:
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
hackage पर "सूची" पैकेज से ListT
।
takeWhileM :: (a -> Bool) -> IO a -> IO [a]
takeWhileM p act = do
x <- act
if p x
then do
xs <- takeWhileM p act
return (x : xs)
else
return []
के बजाय
:
do
xs <- takeWhileM p act
return (x : xs)
आप भी उपयोग कर सकते हैं:
liftM (x:) (takeWhileM p act)
उपज:
takeWhileM :: (a -> Bool) -> IO a -> IO [a]
takeWhileM p act = do
x <- act
if p x
then liftM (x:) (takeWhileM p act)
else return []
तो आप उपयोग कर सकते
क्यों "दोहराने()":
एसडीएल के साथ प्रयोग किया? – Peaker
@peaker: 'repeat() :: ListT IO()' एक अनंत आईओ-मोनैडिक सूची है जिसमें मूल्य हैं ('()')। तो हम '(>>) 'इसे' लिफ्ट पोलवेन्ट 'के साथ रखते हैं ताकि अनंत सूची के प्रत्येक तत्व के लिए हम' pollEvent' 'कर सकें। 'टेकवाइली' इसे एक सीमित monadic सूची बनाता है और फिर 'toList' इसे बनाता है' :: आईओ [घटना] '। – yairchu
यह थोड़ा अजीब लगता है .. शायद "repeatM (लिफ्ट pollEvent)" जैसे कुछ का उपयोग करने के लिए और अधिक समझ में आता है? – Peaker