2010-11-06 3 views
11

Я ожидаю, что следующий будет печатать "()" 10 раз в секунду. Но он висит через секунду. Зачем?FRP (реактивный): Как использовать filterE?

adaptE $ fmap print $ filterE (const True) $ atTimes [0.1, 0.2 ..] 

Я обнаружил, что это связано с liftM используется в filterE:

filterE :: (Ord t, Bounded t) => (a -> Bool) -> EventG t a -> EventG t a 
filterE p m = justE (liftM f m) 
where 
    f a | p a  = Just a 
     | otherwise = Nothing 

Я попытался переописать filterE используя fmap и, кажется, работает. Зачем? Как используется стандарт filterE?

Я обнаружил, что переопределяю множество стандартных функций, предоставляемых пакетом reactive (например, , integrate). Означает ли это, что пакет неисправен, или я использую его неправильно?

Спасибо!

+0

[fmap, <$>, лифтA, лифтM одинаковы] (http://stackoverflow.com/questions/1634911/can-liftm-differ-from-lifta/1635208#1635208). – kennytm

+0

Им ДОЛЖНЫ быть одинаковыми. Но «adaptE. fmap print $ atTimes [0,1, 0,2 .. 10] 'работает 10 секунд и' adaptE. liftM print $ atTimes [0,1, 0,2 .. 10] 'никогда не возвращается. Зачем? – Yuras

+0

Реактивный довольно багги – luqui

ответ

3

По моему опыту реактивного глючит, особенно в отношении Monad экземпляра Event (операция монады join немного слишком строгая, и мы не совсем уверены, почему). Избегайте, если это возможно. Реактивный был экспериментом и представляет собой возможное с большей поддержкой времени выполнения. См. Yampa для более стабильной, надежной и хорошо перемещаемой библиотеки FRP, даже если она немного менее выразительна.