FRP (реактивный): как использовать filterE? - PullRequest
11 голосов
/ 06 ноября 2010

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

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 (например, diffE, integrate).Означает ли это, что пакет содержит ошибки или я использую его неправильно?

Спасибо!

1 Ответ

3 голосов
/ 08 ноября 2010

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

...