2012-04-03 5 views
7

반응식 바나나에서 일련의 숫자를 생성하는 이벤트 스트림이 있는데 그 중 일부는 여러 번 연속으로 반복됩니다 (모든 중복, 순차적 복제). 비 순차적 복제 만 포함하도록 이벤트 스트림을 수정하려면 어떻게해야합니까?반응식 바나나에서 반복되는 이벤트를 제거하는 방법

변경 사항을 사용하여 이벤트가 새 번호 일 때만 동작이 "변경"되는 것으로 생각했지만 동작 대신 새 입력 이벤트가 수신 될 때마다 변경 이벤트가 트리거됩니다.

답변

6

주, 그것은 은 이벤트와 행동을 일반 프로그래밍에 사용할 수 없습니다. 중복 이벤트 발생을 진압 할

함수는 test 실행

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] 

다음과 같이 mapAccumfilterJust 연결자 환산 원하는

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

제공 할 수있다.

즉, Event을 발생 목록으로 생각한 다음 사랑하는 "목록"연결자를 적용 할 수 있습니다.

+0

오, 왜 그렇게 생각하지 않았습니까?! 이 질문에 찬성하여 내 대답에서 추악한 구현을 제거했습니다. – ehird

+1

변경 사항을 사용해서는 안되는 경우 행동에 의미있는 것을 어떻게 할 수 있습니까? – Orclev

+0

@Orclev : 이벤트에 동작을 적용 할 수 있습니다. '<@>'과'<@'연산자가 사용됩니다. 또한 동작과 이벤트간에 상호 재귀를 사용할 수 있습니다. –

0

글쎄, changes은 아무 것도 Behavior으로 바꾸지 않습니다. 에서 Behavior의 변경을 NetworkDescription으로 변경하면 외부 프레임 워크에 붙일 수 있습니다. behaviour of changeschanges (stepper x e)return (calm e)으로 설명되므로 stepperchanges을 통해 이벤트를 라운드 트립하면 (모든 동시 발생을 무시하지만 첫 번째 이벤트 만 제외)이 효과가 없습니다.

값을 변경하지 않는 항목을 버리기 위해 결합자를 사용하는 것이 유용합니다. 다른 FRP 프레임 워크가 내장되어 있다고 생각합니다. 그러나 하인리히의 답변에서 볼 수 있듯이 쉽게 작성할 수 있습니다. changes 기능 은 GUI 툴킷과 thelike 바인딩에 사용할 수 것을

관련 문제