22

ReactiveXの紹介ページから:

「関数型リアクティブ プログラミング」と呼ばれることもありますが、これは誤称です。ReactiveX は関数型かもしれませんし、リアクティブ型かもしれませんが、「関数型リアクティブ プログラミング」は別物です。主な相違点の 1 つは、関数型リアクティブ プログラミングが時間の経過とともに連続的に変化する値で動作するのに対し、ReactiveX は時間の経過とともに放出される離散値で動作することです。

一方、ウィキペディアの Functional Reactive Programming ページから、ReactiveX は「実装」セクションにリストされています。

実装[編集]

  • cellx、javascript のリアクティブの超高速実装
  • Elm、HTML、CSS、および JavaScript にコンパイルされる FRP 言語
  • Ruby でのフラペチーノ FRP 実装
  • Flapjax、動作/イベント FRP の JavaScript での実装
  • Reactive.jl、Julia での FRP 実装
  • Java、JavaScript、Python、Swift などを含む複数の言語での ReactiveX、FRP の実装
  • Haskell でのリアクティブ バナナ FRP 実装
  • Swift と Objective-C で実装された ReactiveCocoa FRP
  • 純粋な Swift に実装された ReactiveKit FRP
  • Haskell での Reflex FRP の実装
  • Scala.Rx Scala (および Scala.js) での FRP 実装
  • Sodium、C#、C++、Haskell (非推奨[12])、Java、Rust、および Scala での FRP 実装
  • Haskell での Yampa FRP の実装

私は ReactiveX の機能をよく理解しており、「リアクティブ プログラミング」と「関数型リアクティブ プログラミング」についても調査しましたが、それらの間の関係をまだ区別できません。

実際、ウィキペディアのページは誤称であるか、「実装」セクションに例を誤ってリストしていると思います。なぜなら、 cellxReactiveX (両方とも例にリストされています) が完全に異なる問題を解決するために構築されていることを知っているからです。

4

2 に答える 2

7

私が理解している限り、ReactiveX (別名 RX) の観点からは、2 つのイベントを同時に「同時に」発生させることは不可能です。これらは、 subscription の順序で、内部的に順番に起動される単なるコールバックです。RX は時間を「管理」しません。

純粋な FRP プログラマの目を通して見ると、RX はかなり狂ったように振る舞うことができます。次の RXJS コードを検討してください。

const xs = Rx.Observable
    .interval(0)
  //.share();

xs.combineLatest(xs, (a,b) => [a,b])
    .filter(ab => ab[1] > ab[0])
    .take(1)
    .subscribe(ab => alert(ab));

これxsは、可能な限り速く発火する寒冷観測可能間隔です。xs.combineLatest(ys, f)は常にxs最初に にサブスクライブし、次に にサブスクライブするため、生成されるysことが期待されます。 Soは常に false である必要があります。ただし、私のPCでは、このコードをしばらく実行し続けると、ある時点で終了し、時間がかかる場合があります。自分で試してみてくださいxs.combineLatest(xs, (a,b) => [a,b])[0,0], [1,0], [1,1], [2,1], ...ab[1] > ab[0]

これxsは、 がコールドオブザーバブルであるためです。各サブスクリプションintervalは、独立して実行される定期的なタイマーを作成します。これらのタイマーは、ある時点で別の順序で起動することができます (特に .NET のようなマルチスレッド環境では)。

//share行をコメントアウトしてxs hot[0,0], [1,0], [1,1], ... ,[i,i-1],[i,i]...にすると、決定論的に生成されるようになったため、シーケンスは完了しません。これは、ホット オブザーバブルが単一のサブスクリプションを共有するためです。この場合、単一のタイマーのみが作成されます。

実際の FRP システムでは、この動作は決定論的です。ただし、実際の FRP システムで異なるハードウェア タイマーに実際に接続する場合、これらの外部イベントはランダムな順序で発生するため、RX と同じ動作も得られます。もちろん、2 つのタイマーが完全に同期されていない限りです。

于 2016-02-29T22:41:01.650 に答える