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, даже если она немного менее выразительна.