(関数型)リアクティブプログラミングとは何ですか?質問する

(関数型)リアクティブプログラミングとは何ですか?質問する

私はウィキペディアの記事を読みましたリアクティブプログラミング。また、関数型リアクティブプログラミング説明はかなり抽象的です。

  1. 関数型リアクティブプログラミング (FRP) は実際には何を意味するのでしょうか?
  2. リアクティブ プログラミング (非リアクティブ プログラミングとは対照的に) は何で構成されますか?

私のバックグラウンドは命令型/オブジェクト指向言語なので、このパラダイムに関連する説明をいただければ幸いです。

ベストアンサー1

FRPの感触をつかみたい場合は、古いものから始めるといいでしょう。フランチュートリアル1998年からのアニメーションイラスト付き。論文の場合は、機能的リアクティブアニメーションそして私のホームページの出版物リンクと繊維強化プラスチックリンクハスケルウィキ

個人的には、FRP の実装方法を検討する前に、FRP が何を意味するかについて考えるのが好きです。(仕様のないコードは質問のない回答であり、したがって「間違ってもいない」)。したがって、私は Thomas K が別の回答で行っているように、表現/実装の用語で FRP を説明しません (グラフ、ノード、エッジ、発火、実行など)。実装スタイルは多数考えられますが、FRP が何であるかを説明した実装はありませ

私は、FRP は「時間経過とともに値を表すデータ型」であるという、Laurence G のシンプルな説明に共感します。従来の命令型プログラミングでは、これらの動的な値は、状態と変化を通じて間接的にしか取得できません。完全な履歴 (過去、現在、未来) には、第一級の表現はありません。さらに、命令型パラダイムは時間的に離散的であるため、離散的に進化する値のみを (間接的に) 取得できます。対照的に、FRP はこれらの進化する値を直接取得し、継続的に進化する値に問題はありません。

FRP は、命令型並行処理を悩ませる理論的かつ実用的な混乱に陥ることなく並行処理できるという点でも珍しいものです。意味的には、FRP の並行処理はきめ細かく決定的で、継続的です。(ここで言っているのは意味についてであり、実装についてではありません。実装には並行処理や並列処理が含まれる場合と含まれない場合があります。) 意味の決定性は、厳密な推論と非公式な推論の両方において非常に重要です。並行処理は命令型プログラミングに多大な複雑さを追加しますが (非決定論的インターリーブのため)、FRP では苦労しません。

では、FRP とは何でしょうか? 自分で発明することもできます。次のアイデアから始めましょう:

  • 動的/進化する値 (つまり、「時間の経過に伴う値」) は、それ自体がファーストクラスの値です。これらを定義して組み合わせたり、関数に渡したりすることができます。私はこれらを「動作」と呼んでいます。

  • 動作は、一定の (静的な) 動作や時間 (時計など) などのいくつかの基本要素から構築され、順次および並列の組み合わせによって構築されます。n 個の動作、n 項関数 (静的な値に対して) を「ポイントごとに」、つまり時間の経過とともに連続的に適用することによって結合されます。

  • 離散的な現象を説明するには、別の種類 (ファミリ) の「イベント」を用意します。各イベントには、発生のストリーム (有限または無限) があります。各発生には、関連付けられた時間と値があります。

  • すべての動作とイベントを構築できる構成語彙を見つけるには、いくつかの例を試してみましょう。より一般的で単純な部分に分解し続けます。

  • しっかりとした基盤の上に立っていることを確認するために、表示的意味論の手法を使用して、モデル全体に​​構成的基盤を与えます。これは、(a) 各型が対応する単純で正確な数学的タイプの「意味」を持ち、(b) 各プリミティブと演算子が構成要素の意味の関数として単純で正確な意味を持つことを意味します。実装に関する考慮事項を探索プロセスに決して混ぜないでください。この説明が意味不明な場合は、(a) を参照してください。型クラス射による表示的設計、(b)プッシュプル関数型リアクティブプログラミング(実装ビットを無視)、(c)表示的意味論Haskell ウィキブックス ページ表示的意味論には、創始者である Christopher Strachey と Dana Scott の 2 つの部分があることに注意してください。より簡単で便利な Strachey の部分と、より難しくあまり役​​に立たない (ソフトウェア設計の場合) Scott の部分です。

これらの原則に従えば、多かれ少なかれ FRP の精神に沿ったものが得られると思います。

これらの原則はどこから得たのでしょうか。ソフトウェア設計では、私はいつも同じ質問をします。「それは何を意味するのか?」。表示的意味論は、この質問に対する正確なフレームワークを提供してくれました。これは私の美学に合致するものです (操作的意味論や公理的意味論とは異なります。どちらも満足のいくものではありません)。そこで、私は自分自身に、動作とは何かと問いかけました。すぐに、命令型計算の時間的に離散的な性質は、動作自体の自然な説明ではなく、特定のスタイルのマシンへの適応であることに気付きました。私が思いつく最も単純で正確な動作の説明は、単に「(連続) 時間の関数」です。これが私のモデルです。嬉しいことに、このモデルは、連続的で決定論的な並行性を簡単に優雅に処理します。

このモデルを正確かつ効率的に実装するのは非常に困難でしたが、それはまた別の話です。

おすすめ記事