私は一般的に反応性のバナナとFRPを初めて使用しています。zipE :: Event t a - >イベントt b - >イベントt(a、b)
my project(GDB/MIフロントエンド)GUIとフロントエンドロジックモジュールの両方にリアクティブバナナ(バージョン0.6.0.0)を使用しています。前者は素晴らしいですが、後者のために私は明らかに追加のコンビネータが必要です。
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
、私はこれで満足していません。そこで、私はchanges
を使わずにジェネリックなzipE関数を実装する方法を尋ねたいと思っていました(非GUIの目的で使うことはお勧めしません)。
他の試みは失敗しました。 1つシフトされたタプルの最初の要素で
zipE :: Num a => Event t a -> Event t b -> Event t (a,b)
zipE ea eb = apply (stepper (0,) ((,) <$> ea)) eb
結果 - 私はstepper
によって導入された「わずかな遅れ」による推測。しかし、私はstepper
(またはそれに関してはaccumB
)のイベントなしで動作を取得する方法は見当たりませんし、動作のないイベントにどのように機能を適用するのか分かりません。全体として、私はジェネリック型の場合にステッパーに初期値を与える方法を見ていません。
'ea'と' eb'は同時に起動しません。 (彼らが同じ基本イベントから派生しているので、同時に発射することが分かっている場合は、その基本イベントを再処理するのが最善でしょう。)火災が発生したときに何が起こりたいのか、 t? – dave4420
デイブ、そうです。イベントネットワークには別のデザインが必要です: - /これを指摘していただきありがとうございます。 – copton
私は本当に別のイベントネットワークが必要でした。最初は、2つのイベントを圧縮してタプルを 'f ::(a、b) - > IO()'に送りたいと思っていました。私は今代わりに 'f :: a - > b - > IO()'と '$(f <$> stepper 0 aE)<@> bE'を反応させます。 – copton