netwireクイックスタートを読みましたが、「実際の」アプリケーションで全体がどのように見えるかを想像するのに問題があります。チュートリアルは純粋なワイヤーしか扱っていないので、ゲームがあれば特に興味がありますが、それ以外は気にしません。Reactive Banana の例もおそらく同様です。FRP の有用性を説明するだけです。
2 に答える
Netwire はいくつかの実際のアプリケーションで使用されていますが、どこにあるのかわかりません。彼らは現在密室にいる可能性が高い。ただし、いくつかのサンプル アプリケーションが Reddit でブログに投稿されているので、/r/haskellをチェックしてみてください。そこで「netwire」を検索してください。残念ながら、特にイベント処理に関するこれら 2 つのライブラリの概念はまったく異なるため、リアクティブ バナナの例は役に立ちません。
Netwire アプリケーションの全体的な構造は次のとおりです。まず、リアクティブ値を定義し、それを と呼びましょうsimulation
。最も単純なケースでは、純粋なワイヤです。
simulation :: WireP a [Particle]
そのワイヤの書き方については (まだ) 詳細に述べていませんが、それが何であるかを説明しましょう。出力タイプは[Particle]
であるため、パーティクルのリアクティブ リストです。つまり、このリストは時間の経過とともに変化する可能性があります。特に、入力タイプは完全にポリモーフィックであるため、このリアクティブ値は他のリアクティブ値に依存しないことがわかります。
ここで、特定の時点での粒子リストの実際の値を取得したいと考えています。stepSessionP
ここで、セッションとステッピング関数の出番です。ほとんどのアプリケーションは、この場合のように、セッション ステッピング関数の 1 つだけを必要とします。この関数をループで呼び出すだけで、この時点でのワイヤの現在の値を取得できます。この関数を連続して呼び出す必要はありません。
[Particle]
ステッピング関数ではではなく が得られることに気付くでしょうEither LastException [Particle]
。これは、Netwire の反応値が阻害される可能性があるためです。これがイベントのコンセプトです。圏論からわかることは、
w . id
は とほぼ同じw
ですx + 0
は と同じx
です。ID ワイヤは に関して中立(.)
です。しかし、今想像してみてください
w . myId
wheremyId
はアイデンティティ ワイヤーのように機能し、依存するリアクティブ値を生成するだけですが、まったく生成されない場合もあります。値を無視して単に禁止する場合もありますが、その場合は構成自体が禁止されます。イベント ワイヤーとして解釈myId
し、コンポジションを " w
if myId
"として読み取ることができます。
w . keyDown Space
(<|>)
次に、イベントの「または」のように機能する選択演算子があります。
w1 . ev1 <|> w2 . ev2 <|> w3
禁止されている場合ev1
は、残りが試行されます。stepSessionP_
理想的には、メイン ワイヤが抑制されないため、代わりに使用できますが、抑制される可能性のあるワイヤで構成されています。独自の抑制モノイドを使用して、終了シグナルなどを設定することもできます。