ある時点で、機能的なリアクティブ フレームワークの作成をいじることを検討しています。私はそれについてかなり多くのことを読み、いくつかの例を見てきましたが、このフレームワークが FRP 拡張/DSL と見なされるために何をしなければならないかについて明確な考えを得たかったのです。私は実装の問題や詳細などにはあまり関心がありませんが、完璧な世界の状況で何が望まれるかについてはもっと関心があります。
理想的な関数型リアクティブ プログラミング言語の主要な操作と品質は何でしょうか?
ある時点で、機能的なリアクティブ フレームワークの作成をいじることを検討しています。私はそれについてかなり多くのことを読み、いくつかの例を見てきましたが、このフレームワークが FRP 拡張/DSL と見なされるために何をしなければならないかについて明確な考えを得たかったのです。私は実装の問題や詳細などにはあまり関心がありませんが、完璧な世界の状況で何が望まれるかについてはもっと関心があります。
理想的な関数型リアクティブ プログラミング言語の主要な操作と品質は何でしょうか?
最初に実装ではなく、仕様について質問してくださったことを嬉しく思います。FRP とは何かについては、さまざまなアイデアが飛び交っています。90 年代初頭 (私が Sun Microsystems とその後 Microsoft Research でインタラクティブ グラフィックスの仕事をしていたとき) の最初の頃から、(a) 指示的および (b) 時間的に連続した 2 つのプロパティについてでした。多くの人々は、これらの特性の両方を捨てて、さまざまな実装概念で FRP を識別しています。混乱を避けるために、Jake McArthur が昨年の会話で提案したように、「関数型リアクティブ プログラミング」という用語を、より正確で説明的な「指示的連続時間プログラミング」(DCTP) に置き換えたいと思います。
「指示的」とは、各型とビルディング ブロックの意味を正確に指定する、正確で単純な、実装に依存しない、構成上のセマンティクスに基づいていることを意味します。次に、セマンティクスの構成上の性質によって、ビルディング ブロックのすべての型が正しい組み合わせの意味が決まります。私にとって、指示的は関数型プログラミングの核心であり本質であり、正確で扱いやすい推論を可能にし、したがって正確性、導出、および最適化の基盤となります。ピーター・ランディンは、あいまいな用語「関数型」の実質的な代替として「指示的」を推奨し、機能的な見た目の表記法から深く/真に機能的なプログラミングを区別する方法を推奨しました。Landin の引用と参考文献については、このコメントを参照してください。
連続時間については、連続時間でプログラムする理由の投稿を参照してください。このページのAshleyFの回答での私の引用。コンピュータの離散的な性質を考えると、連続時間の概念は何らかの形で不自然であるか、実装が不可能であるという主張を何度も聞いて驚いています。この考え方は、いくつかの理由から、特に Haskeller から来ている場合、私には奇妙に思えます。
TBAGとActiveVRML (最初の DCTP/FRP システム) 以降のFran以来、連続時間でプログラミングするためのライブラリを作成してきました。正しく実装するのは簡単です。いくつかの異なるアプローチが論文Functional Implementations of Continuous Modeled Animation で説明されています。連続時間を効率的に (しかも正確に!)実装することは別の問題です。( Push-pull Functional Reactive Programmingの論文を参照してください。)
関連する発言については、「リアクティブ プログラミングと関数型リアクティブ プログラミングの違い」および「(関数型)リアクティブ プログラミングとは」に対する私の回答を参照してください。更新:連続時間が重要である理由の詳細については、これらのメモを参照してください。更新:私の 2015 年のトークThe Essence and origins of FRP (およびそこにリンクされている関連トーク) も参照してください。
ご不明な点がございましたら、お気軽にお問い合わせください。私の連絡先情報はホームページにあります。
おそらく、機能的 I/O に関するMatthias Felleisen の講演と彼の論文を読んだことがあると思います。彼のアプローチは非常に実用的で美しいものだと思います。コナル・エリオットの優れた作品のいくつかにも出くわしたことを願っています.
私の個人的な要件は、システムが完全に純粋であることです。つまり、すべての動作は純粋なworld->world
関数によって定義され、すべての実現または視覚化はworld->visual
関数によって定義されます。システムからの出力のvisual
静的な説明です。
私のもう 1 つの主な機能は、歴史的なデバッガーです。world
状態の履歴を維持し、任意の時点から再生できるようにすることは比較的簡単なはずです。
world->world
非常に興味深い研究の 1 つの領域 (私は未解決の問題だと思います) は、いくつかの離散クロックティックで関数を反復するのではなく、連続時間を使用することです。私は以前、FRP に関するいくつかのブログ投稿を行ったことがあり、Conal Elliottは次の示唆に富むコメントを残しました。
構成可能性とセマンティックの明確さのために、表示的/機能的なアプローチが好きです。同じ理由で、私は離散的な時間と空間よりも連続した時間と空間を好みます。これらすべてのケースにおいて、機械的ではない表現は、機械ベースのプレゼンテーションの方法と何をうまく区別しています。
それを解決すれば、あなたはヒーローになるでしょう!