2010-11-06 26 views
11

Tôi hy vọng tiếp theo sẽ in "()" 10 lần trong một giây. Nhưng nó bị treo sau một giây. Tại sao?FRP (phản ứng): Làm thế nào để sử dụng filterE?

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

tôi thấy rằng nó có liên quan đến liftM sử dụng trong 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 

Tôi cố gắng để reimplement filterE sử dụng fmap và có vẻ như để làm việc. Tại sao? Tiêu chuẩn filterE được thiết kế để sử dụng như thế nào?

Tôi thấy mình đang thực hiện rất nhiều chức năng chuẩn được cung cấp bởi gói reactive (ví dụ: diffE, integrate). Nó có nghĩa là gói bị lỗi hoặc tôi sử dụng nó theo cách sai?

Cảm ơn!

+0

[fmap, <$>, liftA, liftM đều giống nhau] (http://stackoverflow.com/questions/1634911/can-liftm-differ-from-lifta/1635208#1635208). – kennytm

+0

Họ NÊN giống nhau. Nhưng 'thích ứng. fmap in $ atTimes [0.1, 0.2 .. 10] 'hoạt động 10 giây và' thích ứng. liftM in $ atTimes [0.1, 0.2 .. 10] 'không bao giờ trả về. Tại sao? – Yuras

+0

phản ứng là khá lỗi – luqui

Trả lời

3

Trong kinh nghiệm phản ứng của tôi là lỗi, đặc biệt là đối với trường hợp Monad của Event (hoạt động đơn lẻ join hơi quá nghiêm ngặt và chúng tôi không chắc chắn lý do tại sao). Tránh điều đó nếu có thể. Phản ứng là một thử nghiệm, và đại diện cho những gì có thể có được với sự hỗ trợ thời gian chạy nhiều hơn. Xem Yampa để biết thư viện FRP ổn định hơn, đáng tin cậy và được truyền đi tốt hơn, ngay cả khi nó ít diễn cảm hơn một chút.

Các vấn đề liên quan