2012-04-03 64 views
7

Trong chuối phản ứng Tôi có một luồng sự kiện tạo một chuỗi các số, một số lặp lại nhiều lần liên tiếp (tôi không quan tâm đến tất cả các bản sao, chỉ trùng lặp tuần tự). Làm cách nào tôi có thể sửa đổi luồng sự kiện đó để chỉ chứa các bản sao không tuần tự?Làm thế nào để bạn loại bỏ các sự kiện lặp lại trong chuối phản ứng

Tôi đã thử sử dụng các thay đổi để chuyển đổi hành vi thành hành vi cho rằng hành vi sẽ chỉ "thay đổi" khi sự kiện là số mới nhưng thay vào đó hành vi sẽ kích hoạt sự kiện thay đổi mỗi khi nhận được sự kiện nhập mới.

Trả lời

6

Lưu ý rằng changes chức năng nên chỉ được sử dụng để liên kết với các bộ công cụ GUI và thelike, cần không được sử dụng để lập trình thường xuyên với các sự kiện và hành vi.

Một chức năng mà supresses lần xuất hiện sự kiện trùng lặp có thể được thể hiện trong điều khoản của mapAccumfilterJust combinators như sau

skipEqual :: Eq a => Event t a -> Event t a 
skipEqual = filterJust . fst . mapAccum Nothing . fmap f 
    where 
    f y (Just x) = if x == y then (Nothing,Just x) else (Just y,Just y) 
    f y Nothing = (Just y, Just y) 

test = interpretModel skipEqual $ map (:[]) [1 :: Int,1,2,3,3,2] 

Chạy test cho

*Main> test 
[[1],[],[2],[3],[],[2]] 

như mong muốn.

Nói cách khác, bạn có thể chỉ cần tưởng tượng Event làm danh sách các lần xuất hiện và sau đó áp dụng bộ kết hợp "danh sách" yêu thích của bạn vào đó.

+0

Ồ, tại sao tôi không nghĩ về điều đó ?! Tôi đã gỡ bỏ việc triển khai xấu xí khỏi câu trả lời của tôi để ủng hộ vấn đề này. – ehird

+1

nếu bạn không nên sử dụng thay đổi, làm cách nào để bạn làm bất kỳ điều gì có ý nghĩa với hành vi? – Orclev

+0

@Orclev: Bạn có thể áp dụng các hành vi cho các sự kiện. Các toán tử '<@>' và '<@' được sử dụng cho điều đó. Ngoài ra, bạn có thể sử dụng đệ quy lẫn nhau giữa các hành vi và sự kiện. –

0

Vâng, changes không biến bất kỳ thứ gì thành Behavior; nó chỉ cho phép bạn quan sát thay đổi của một Behavior trong NetworkDescription, để bạn có thể dán nó vào khung bên ngoài. behaviour of changes được mô tả là changes (stepper x e)return (calm e), do đó, việc vấp ngã một sự kiện qua stepperchanges sẽ không có hiệu lực nào khác ngoài calm (chỉ đơn giản là loại bỏ tất cả các lần xuất hiện đồng thời nhưng lần đầu tiên). Thật hữu ích khi có một bộ kết hợp để loại bỏ các lần xuất hiện không thay đổi giá trị, và tôi nghĩ rằng một số khung FRP khác có sẵn. Nhưng bạn có thể viết khá dễ dàng, như câu trả lời của Heinrich cho thấy.

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