2010-11-06 13 views
11

Oczekuję, że następny wydrukuje "()" 10 razy na sekundę. Ale wisi po chwili. Czemu?FRP (reaktywne): Jak korzystać z filtru?

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

stwierdziliśmy, że jest to związane liftM stosowanych w 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 

Próbowałem reimplement filterE korzystając fmap i wydaje się działać. Czemu? Jak zaprojektowano standard filterE?

Znalazłem się reimplementing wiele standardowych funkcji dostarczonych przez pakiet reactive (np. diffE, integrate). Czy to oznacza, że ​​pakiet jest błędny lub używam go w niewłaściwy sposób?

Dzięki!

+0

[fmap, <$>, liftA, liftM są takie same] (http://stackoverflow.com/questions/1634911/can- liftm-differ-from-lifta/1635208#1635208). – kennytm

+0

Powinny być takie same. Ale 'adaptE. fmap print $ atTimes [0.1, 0.2 .. 10] 'działa 10 sekund i' adaptE. liftM print $ atTimes [0.1, 0.2 .. 10] 'nigdy nie zwraca. Czemu? – Yuras

+0

reaktywny jest dość błędny – luqui

Odpowiedz

3

Z mojego doświadczenia biernej ma błędy, zwłaszcza w odniesieniu do instancji Monad z Event (operacja monada join jest nieco zbyt surowe i nie jesteśmy do końca pewien, dlaczego). Unikaj tego, jeśli to możliwe. Reaktywny był eksperymentem i reprezentował to, co może być możliwe dzięki większej liczbie uruchomień. Zobacz Yampa, aby uzyskać bardziej stabilną, niezawodną i dobrze przejechaną bibliotekę FRP, nawet jeśli jest nieco mniej ekspresyjna.

Powiązane problemy