私はreactive-bananaを使用したプログラムに取り組んでおり、基本的なFRPビルディングブロックを使用してタイプを構造化する方法を考えています。
たとえば、実際のプログラムの簡単な例を次に示します。たとえば、システムが主にウィジェットで構成されているとします。プログラムでは、時間の経過とともに変化するテキストの断片です。
ができた
newtype Widget = Widget { widgetText :: Behavior String }
しかし、私も持つことができます
newtype Widget = Widget { widgetText :: String }
Behavior Widget
時変の振る舞いについて話したいときに使用します。これにより、作業が「簡単」になり、Behavior
ウィジェットを解凍して再パックするのではなく、操作をより直接的に使用できるようになります。
一方、前者は、ほとんどすべてのウィジェットが時間の経過とともに変化するため、実際にウィジェットを定義するコードの重複を回避しているようです。また、ウィジェットをBehavior
組み合わせることで、ウィジェットを定義しないものもいくつか定義していることに気付きます。より一貫した方法で他のもの。
別の例として、両方の表現で、インスタンスを持つことは理にかなっていMonoid
ます(そして、私はプログラムにインスタンスを持ちたいです)が、後者の実装はより自然に見えます(リストモノイドをニュータイプに簡単に持ち上げるだけなので) )。
(私の実際のプログラムではではDiscrete
なくを使用Behavior
していますが、それは適切ではないと思います。)
同様に、Behavior (Coord,Coord)
またはを使用(Behavior Coord, Behavior Coord)
して2Dポイントを表す必要がありますか?この場合、前者は当然の選択のようです。しかし、それがゲーム内のエンティティのようなものを表す5要素のレコードである場合、選択はあまり明確ではないように思われます。
本質的に、これらの問題はすべて次のようになります。
FRPを使用する場合、どのレイヤーでBehavior
タイプを適用する必要がありますか?
Event
(程度は低いですが、同じ質問が当てはまります。)