web-dev-qa-db-ja.com

プッシュプルFRSと矢印FRPは根本的にどのように違いますか?

HaskellでFRPを勉強したいのですが、使用するライブラリを決定するのは少し難しいです。多くは死んだ試みであるように思われ、いくつかは復活したようです(ヤンパでの最近の活動など)。

私が読んだことから、FRPには2つの「種類」があるようです。プッシュプルFRP(リアクティブバナナのような)が片側にあり、矢印の付いたFRP(ヤンパのような)が反対側にあります。 FranおよびFrTimeの時点で「クラシックFRP」も使用されていたようですが、これらの最近のアクティビティは見当たりません。

  • これらの2つ(または3つ)は、FRPの根本的に異なるアプローチですか?

  • それらの1つは時代遅れの理論であるのに対して、もう1つは「未来のもの」でしょうか。

  • または、異なる目的に対応して並行して進化する必要がありますか?

  • 各カテゴリの最も著名なライブラリに名前を付けましたか、または考慮すべき他のオプション(ナトリウム、Netwireなど)はありますか?


私はついに、J。Abrahamsonのコメントで推奨されている Evan Czaplickiからのトーク を見ました。それは非常に興味深いものであり、物事を明確にするのに役立ちました。この質問を興味深いと思う人には、これを強くお勧めします。

262
Guillaume Ponce

あなたの質問を調査するためにHaskell.orgに旅行しました。私が見つけたのは、あなたの研究を進めるために読むべき重要な2つの論文であり、これらの学術論文からあなたの質問に対する答えを構築しています。

コナルエリオットによるプッシュプルFRP

ジョン・ヒューズによるモナドの矢への一般化


  1. はい、でもありません。エリオットによれば、Pushはデータ駆動型FRP評価であり、pullは「デマンド」駆動評価と呼ばれるもの。プッシュはデータ入力間でアイドルになる傾向があるため、著者はプルを推奨しています。重要なのは次のとおりです:Push-pullは、値の再計算の必要性を最小限に抑えるために、これらの動作を組み合わせてバランスをとります。 それは簡単です;プッシュプルでFRPを操作すると、反応する能力が早まります。 Arrowは、抽象型を使用して値をリンクし、同時に評価するための異なる手法です。これらの概念はすべて根本的に異なります。しかし、私の言葉を信じないでください。

    Arrowインターフェイスの性質は、再評価を最小限にするという目標にとって問題があります。入力イベントと動作は単一の入力に結合され、コンポーネントが変更されるたびに変更されます(Elliott)。

    したがって、矢印はプッシュプルの目標と矛盾します。これは、これらのすべてを一度に使用できないことを意味するものではなく、単に複雑になるだけでなく、抽象的な矢印型なしでは計算できないものもあります。

  2. どのアプローチが「未来の道」であるかについて、学術的な意見を見つけていません。矢印は同時性を特にうまく処理できることに注意してください。矢印を実装し、プッシュプルを使用して計算を最小限に抑えることができれば、それが将来の道です。

  3. はい、彼らは別々の目的に取り組んでいます。私が言ったように、それらは一緒に定式化することができますが、実装するのは困難であり、たとえそれが機能しても、プッシュプルの反応速度の利点をおそらく無効にします。

  4. それは主観的ですが、ReactiveとYampaはFRPで最もよく引用されている言語ライブラリのようです。 Conal ElliottのReactiveには深いルーツがあり、Yampaも設立されていると思います。 Netwireのような他のプロジェクトは代替品として生まれましたが、巨人を代替するまでにはしばらく時間がかかるかもしれません。


お役に立てれば!私が指摘した記事を読んだことで言ったように、矢印、プッシュ、プルのセマンティックな距離をよりよく理解できます。

16