12

すみません、反応バナナとFRPを調べ始めたところです。

反応バナナの作成者は、私の提案に従ってこの例を作成しました。この例では、増減できるカウンターを作成します。彼は、イベントを蓄積する accumE 関数を使用します。Event 型はある程度理解できて、かなりのテストができたと思いますが、Behavior もあったことを思い出しました。調べてみましたが、似たような状況で使われることを意図しているようです。accumE がイベントに対して行うように、既存の変数を変更します。

動作とは何を意味し、どのような使用例がありますか?

4

4 に答える 4

11

私は Chris ではなく Ankur に同意します。テキスト ボックスは時間の経過に伴う値であるため、自然にイベントではなく動作になりたいと考えています。イベントのあまり自然でない選択について Chris が挙げた理由は、実装の問題であり、(正確であれば) リアクティブ バナナ実装の不幸な成果物です。不自然に使用されるパラダイムよりも、実装が改善されることを望んでいます。

Behaviorセマンティックフィットに加えて、 overを選択することは実用的に非常に便利ですEvent。次に、Applicativeたとえば、操作 ( など) を使用liftA2して、時間によって変化するテキスト ボックスの値を他の時間によって変化する値 (動作) と組み合わせることができます。

于 2011-07-01T00:30:01.337 に答える
7

意味的に、あなたは持っています

Behavior a = Time -> a

つまり、aBehavior aは時間とともに変化する型の値ですa。一般に、がいつ変更されるかについてはまったくわからないBehavior aため、ボタンをクリックしてテキスト フィールドを更新するのは、かなり不適切な選択であることがわかります。とはいえ、カウンター例の数値の現在の値を表す動作を取得するのは簡単です。stepperイベント ストリームで使用するか、accumB代わりにaccumE.

通常、入力と出力に接続するものは常にEvents になるため、Behavior内部で中間結果に使用されます。

与えられた例で、単純な電卓のメモリ機能のように、現在の値を記憶する新しいボタンを追加するとします。メモリ ボタンと、記憶された値のテキスト フィールドを追加することから始めます。

bmem    <- button f [text := "Remember"]
memory  <- staticText f []

いつでも現在の値を要求できるようにする必要があるため、ネットワークでは、それを表す動作を追加します。

let currentVal = stepper 0 counter

次に、イベントを接続しapply、Remember ボタンが押されるたびにビヘイビアーの値を読み取り、その値のシーケンスでイベントを生成するために使用できます。

emem <- event0 bmem command
let memoryE = apply (const <$> currentVal) emem

最後に、この新しいイベントを出力に接続します

sink memory [text :== ("", show <$> memoryE)]

メモリを内部的に使用したい場合はBehavior、現在の値の も必要になりますが、これは出力に接続するためだけに使用するため、現時点ではイベントのみが必要です。

それは役に立ちますか?

于 2011-06-30T12:43:51.480 に答える
6

図書館の著者が話す。:-)

どうやら、クリス・スミスは私が考えていることを正確に説明しているので、心を読むことができます。:-)

しかし、コナルアーサーにもポイントがあります。概念的には、カウンターは時間とともに変化する値であり、一連のイベント発生ではありません。したがって、それをとして考えるBehavior方が適切です。

残念ながら、動作には、いつ変更されるかについての情報は含まれていません。これは「ポーリングのみ」です。これで、ポーリングを最小限に抑え、GUI要素の効率的な更新を可能にするさまざまな巧妙なスキームの実装を試みることができました。(Conalは元の論文と同様のことをします。)しかし、私は「魔法のない」哲学を採用しました。図書館のユーザーは、イベントを介して更新を自分で管理する責任があります。

私が現在考えている解決策は、とのほかに3番目のタイプ、つまり両方の品質を具体化する(名前は変更される可能性があります)を提供することです。概念的には、時間とともに変化する値ですが、変更を通知するイベントも付属しています。考えられる実装の1つはEventBehaviorReactive

type Reactive a = (a,Event a)

changes :: Reactive a -> Event a
changes (_, e) = e

value :: Reactive a -> Behavior a
value   (x, e) = stepper x e

これがまさにsink期待するタイプであることは当然のことです。これは、reactive-bananaライブラリの将来のバージョンに含まれる予定です。

編集:新しいタイプを含むreactive-bananaバージョン0.4Discreteをリリースしました。これは現在。と呼ばれています。

于 2011-07-04T14:55:23.450 に答える
5

一般に、行動は一定期間にわたって変化する値です。これは連続値ですが、イベントは離散値です。Behavior の場合、値は常に存在します。例: テキスト ボックスのテキストは、テキストが一定期間変化する可能性があるため動作ですが、現在の値が存在します。イベント内のキーボード ストロークとして、その「現在」のキーボード ストロークを照会することはできません。価値。

于 2011-06-30T12:35:17.113 に答える