私は一般的に反応性バナナとFRPに慣れていないので、明らかな何かが欠けている場合はお詫びします。
私のプロジェクト(GDB / MIフロントエンド)では、GUIとフロントエンドロジックモジュールの両方にリアクティブバナナ(バージョン0.6.0.0)を使用しています。前者はうまく機能しますが、後者の場合は明らかに追加のコンビネータが必要です。
それらの1つはですzipE :: Event t a -> Event t b -> Event t (a, b)
。残念ながら、私が思いつくことができるのはchanges
、イベントタイプでジェネリックではなくを使用するNetworkDescriptionモナドのソリューションだけです。
zipE :: Event t Int -> Event t String -> NetworkDescription t (Event t (Int, String))
zipE ea eb = changes $ (,) <$> stepper 0 ea <*> stepper "" eb
もちろん、私はこれに満足していません。したがって、使用せずに汎用zipE関数を実装する方法を尋ねたかったのchanges
です(これは、GUI以外の目的で使用することはお勧めしません)。
他の試みは失敗しました、例えば
zipE :: Num a => Event t a -> Event t b -> Event t (a,b)
zipE ea eb = apply (stepper (0,) ((,) <$> ea)) eb
その結果、タプルの最初の要素が1つシフトします。これは、によって導入された「わずかな遅延」が原因だと思いstepper
ます。stepper
しかし、 (またはそのことについては)イベントから動作を取得する方法がわかりaccumB
ません。また、動作のないイベントに関数を適用する方法もわかりません。そして全体として、ジェネリック型の場合にステッパーに初期値を提供する方法がわかりません。