web-dev-qa-db-ja.com

関数型リアクティブプログラミング言語の仕様

ある時点で、機能的なリアクティブフレームワークを作成することを検討しています。私はそれについてかなり多く読んで、いくつかの例を見ましたが、FRP拡張/ dslと見なされるためにこのフレームワークが何をしなければならないかについて明確な考えを得たいと思いました。私は実装の問題や詳細などにはあまり関心がありませんが、完璧な世界の状況で何が望まれるかについてはもっと関心があります。

理想的な関数型リアクティブプログラミング言語の主要な操作と品質は何でしょうか?

59
seadowg

最初に実装ではなく仕様について質問することから始めてよかったです。 FRPとは何かについてはたくさんのアイデアが浮かんでいます。私にとって、それは常に2つのことでした:(a)外延的および(b)時間的に連続的。多くの人々は、これらのプロパティの両方を削除し、さまざまな実装の概念でFRPを識別します。これらはすべて、私の視点では重要ではありません。混乱を減らすために、 会話でジェイク・マッカーサーが示唆したように、「関数型リアクティブプログラミング」という用語をより正確で説明的な「外延的連続時間プログラミング」(DCTP)に置き換えてほしいと思います。昨年

「外延的」とは、各タイプとビルディングブロックの意味を正確に指定する、正確で単純な、実装に依存しない構成セマンティクスに基づいていることを意味します。次に、セマンティクスの構成上の性質により、ビルディングブロックのすべてのタイプが正しい組み合わせの意味が決まります。私にとって、denotativeは関数型プログラミングの核心であり、正確で扱いやすい推論を可能にするものであり、したがって、正確性、派生、および最適化の基盤です。 。 Peter Landinは、あいまいな用語「関数型」の実質的な置き換えとして「外延的」を推奨し、深く/真に関数型プログラミングを単なる関数型表記と区別する方法を推奨しました。いくつかのLandinの引用と紙の参照については、 このコメント を参照してください。

連続時間については、投稿 なぜ連続時間でプログラムするのですか? とAshleyFの回答の私の引用を参照してくださいこのページ。 連続時間の概念は、コンピューターの離散的な性質を考えると、どういうわけか不自然であるか、実装が不可能であるという主張を聞いて、何度も驚いています。この考え方は、特にHaskellersから来たときに、いくつかの理由で奇妙だと思います。

  • lazy関数型言語を使用して、infiniteデータを有限マシン。その結果、John Hughesの古典的な論文 関数型プログラミングが重要である理由 に示されているように、素敵なモジュール性が得られます。
  • ベクトルグラフィックスなど、連続空間でのプログラミングの例はたくさんありますが、 Pan のようなものもあります。
  • 私は自分のプログラムが、プログラムを実行するマシンではなく、問題空間についての考え方を反映するのが好きで、他の高級言語プログラマーがその好みを共有することを期待する傾向があります。 (「プログラミング言語は、そのプログラムが無関係なものに注意を払う必要がある場合、低レベルです。」-Alan Perlis)

[〜#〜] tbag [〜#〜] および ActiveVRML以来、継続的なプログラミング用のライブラリを作成しています。最初のDCTP/FRPシステム)以降(= /// =)フラン 。正しく実装するのは簡単です。いくつかの異なるアプローチが論文で説明されています 連続モデル化アニメーションの機能実装 。連続時間を効率的に(そしてそれでも正しく!)実装することは別の問題であり、特に不変の値を再計算することを回避します。 (論文 プッシュプル関数型リアクティブプログラミング を参照してください。)

関連するコメントについては、 リアクティブプログラミングと関数型リアクティブプログラミングの違い および (関数型)リアクティブプログラミングとは何ですか?更新:連続時間が重要である理由の詳細については、 これらの注記 を参照してください。 更新:2015年の講演 FRPの本質と起源 (およびそこにリンクされている関連する講演)。

幸運を祈ります。ご不明な点がありましたらお知らせください。私の連絡先情報は 私のホームページ にあります。

113
Conal

おそらく、機能I/Oについて Matthias Felleisenの講演 を見て、 彼の論文 を読んだと思います。彼はとても実用的で美しいアプローチだと思います。 Conal Elliott の素晴らしい作品のいくつかに出くわしたことを願っています。

私の個人的な要件は、システムが完全に純粋であることです。つまり、すべての動作は純粋なworld->world関数によって定義され、すべての実現または視覚化はworld->visual関数によって定義されます。ここで、visualは、システムからのoutputの静的な説明です。

私の他の主な機能は、履歴デバッガーです。 world状態の履歴を維持し、任意の時点から再生できるようにすることは、比較的簡単なはずです。

非常に興味深い研究の1つの領域(未解決の問題だと思います)は、離散クロックティックworld->world関数を繰り返すのではなく、連続時間を使用することです。 -)。私はかつて FRPに関するいくつかのブログ投稿コナルエリオット を行ったことがあります。

私は、構成可能性と意味の明確さのために、外延的/機能的アプローチが好きです。同じ理由で、私は離散時間と空間よりも連続時間と空間を好みます。これらすべての場合において、機械に似ていない定式化は、機械ベースのプレゼンテーションの方法から何をうまく分離します。

それを解決すれば、あなたはヒーローになります!

5
AshleyF