FRP (реактивный): Как использовать filterE?

Я ожидаю, что следующий будет печатать "()" 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

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