7

リアクティブバナナには、一連の番号を生成するイベントストリームがあり、そのうちのいくつかは連続して数回繰り返されます(すべての重複ではなく、連続した重複だけです)。連続していない重複のみを含むようにそのイベントストリームを変更するにはどうすればよいですか?

変更を使用して、イベントが新しい番号の場合にのみ動作が「変更」されると考えて動作に変換しようとしましたが、代わりに、新しい入力イベントが受信されるたびに動作が変更イベントをトリガーします。

4

2 に答える 2

6

このchanges関数は、GUIツールキットなどへのバインドにのみ使用する必要があり、イベントや動作を使用した通常のプログラミングには使用しないでください。

mapAccum重複イベントの発生を抑制する関数は、およびfilterJustコンビネータで次のように表すことができます。

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]

実行testすると

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

望んだ通りに。

言い換えれば、あなたは単に Event出来事のリストとして想像し、そしてあなたの最愛の「リスト」コンビネータをそれに適用することができます。

于 2012-04-03T16:58:15.737 に答える
0

まあ、changes何もに変えませんBehavior; の変化を観察できるので、外部フレームワークに接着できます。の動作は≡として記述されているため、イベントをラウンドトリップすると、 (最初の発生を除くすべての同時発生を単に破棄する)以外の効果はありません。BehaviorNetworkDescriptionchangeschanges (stepper x e)return (calm e)stepperchangescalm

値を変更しないオカレンスを破棄するコンビネータがあると便利です。他のFRPフレームワークにはコンビネータが組み込まれていると思います。しかし、ハインリッヒの答えが示すように、独自のコンビネータを簡単に作成できます。

于 2012-04-03T15:32:34.380 に答える