268

FRP を Haskell で勉強したいのですが、使用するライブラリを決めるのが少し難しいです。多くは失敗した試みのようですが、一部は復活したようです (Yampa での最近の活動など)。

私が読んだところによると、FRP には 2 つの「種類」があるようです: 一方のプッシュプル FRP (Reactive-banana や Reflex など) と、反対側の矢印化された FRP (Yampa のような)。Fran や FrTime の時代には "classic FRP" もあったようですが、最近の活動は見当たりません。

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

  • そのうちの 1 つは時代遅れの理論で、もう 1 つは「未来のもの」でしょうか?

  • それとも、異なる目的に対応しながら、並行して進化する必要がありますか?

  • 各カテゴリで最も有名なライブラリに名前を付けましたか、それとも考慮すべき他のオプション (Sodium、Netwire など) はありますか?


J. Abrahamson のコメントで推奨された [Evan Czaplicki の講演](https://www.youtube.com/watch?v=Agu6jipKfYw) をようやく見ました。それは非常に興味深いものであり、私にとって物事を明確にするのに役立ちました. この質問が面白いと思った人には強くお勧めします。
4

1 に答える 1

21

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

Conal ElliottによるプッシュプルFRP

John Hughes によるモナドのアローへの一般化


  1. はい、いいえ。エリオットによれば、プッシュはデータ駆動型の FRP 評価であり、プルはいわゆる「需要」駆動型の評価に関連しています。プッシュはデータ入力の間でアイドル状態になる傾向があるため、著者はプルをお勧めします。要点は次のとおりです。プッシュプルは、値を再計算する必要性を最小限に抑えることを主な目的として、これらの動作を組み合わせてバランスを取ります。それは簡単です; FRPをプッシュプルで操作すると、反応速度が速くなります。アローは、抽象型を使用して値をリンクし、それらを同時に評価するための別の手法です。これらの概念はすべて根本的に異なります。しかし、私の言葉を鵜呑みにしないでください。

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

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

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

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

  4. これは主観的なものですが、Reactive と Yampa は、FRP で最もよく引用される言語ライブラリのようです。Reactive by Conal Elliott には深い根があり、Yampa も確立されていると言えます。Netwire のような他のプロジェクトが後継として登場しましたが、巨人に取って代わるにはしばらく時間がかかる可能性があります。


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

于 2015-06-20T22:29:28.470 に答える