1. ホーム
  2. functional-programming

[解決済み] (関数型)リアクティブプログラミングとは?

2022-03-19 15:43:01

質問

のWikipediaの記事を読みました。 リアクティブ・プログラミング . に関する小さな記事も読みました。 関数型リアクティブ・プログラミング . 記述はかなり抽象的です。

  1. 関数型リアクティブ・プログラミング(FRP)とは、実際にはどのようなものなのでしょうか?
  2. リアクティブ・プログラミング(ノンリアクティブ・プログラミングと対比して)は、どのような構成になっていますか?

私のバックグラウンドは命令型/OO言語なので、このパラダイムに関連する説明をお願いします。

どのように解決するのですか?

FRPの感覚をつかみたいなら、まずは昔の フランチュートリアル 1998年に制作されたもので、アニメーションのイラストがあります。 論文については、まず 機能的リアクティブアニメーション というリンクでフォローし、私のホームページの出版物のリンクや FRP のリンクです。 Haskell wiki .

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

FRPは「時間と共に」価値を表すデータ型である、というLaurence Gのシンプルな表現に共鳴します。 従来の命令型プログラミングは、このような動的な価値を、ステートとミューテーションによって間接的にしかとらえられません。 過去、現在、未来の完全な歴史は第一級の表現を持っていない。 また 離散的に進化する 命令法のパラダイムは時間的に離散的であるため、(間接的に)値を捕らえることができる。 これに対して、FRP は次のような進化する価値を捉えることができる。 直接 には苦労しないし 継続的に 価値を進化させる。

また、FRPは、命令型並行処理につきものの、理論的・実用的な "ネズミの巣 "にぶつかることなく並行処理ができるという点でも、珍しい存在です。 意味的には、FRPの同時実行は以下の通りです。 きめ細かい , 確定 および 連続的 . (意味の話であって、実装の話ではない。 実装は並行処理や並列処理を伴うかもしれないし、伴わないかもしれない)。 意味的な決定性は、厳密にも非公式にも、推論を行う上で非常に重要である。 並行処理は命令型プログラミングに巨大な複雑さを加えますが(非決定論的なインターリーブが原因)、 FRPでは楽なことなのです。

では、FRPとは何でしょうか? あなた自身が発明したのでは? まずはこのような発想から始めてみてください。

  • ダイナミックに進化する価値(すなわち、時間と共に変化する価値)は、それ自体が第一級の価値である。 それらを定義し、組み合わせることができ、関数に渡したり、関数から出したりすることができます。 私はこれらを「ビヘイビア」と呼んでいます。

  • ビヘイビアは、定数(静的)ビヘイビアと時間(時計のようなもの)のようないくつかのプリミティブから、順次と並列の組み合わせで構築されています。 n ビヘイビアは、(静的な値に対して)n-ary関数を、ポイント・ワイズで、つまり時間的に連続的に適用することによって結合される。

  • 離散的な現象を説明するために、別のタイプ(ファミリー)のイベント(quot;event")があり、それぞれが発生するストリーム(有限または無限)を持っています。 各発生には関連する時間と値があります。

  • すべての行動とイベントを構築するための構成語彙を思いつくために、いくつかの例で遊んでみてください。 より一般的/単純なものに分解していく。

  • つまり、(a)それぞれの型には、対応する単純で正確な数学的型があり、(b)それぞれのプリミティブと演算子には、構成要素の意味の関数として、単純で正確な意味がある、ということである。 決して、決して 実装を考慮した探索を行うこと。 この説明がちんぷんかんぷんな場合は、(a)を参考にしてください。 型クラスモーフィズムを用いたデノテーショナルデザイン , (b) プッシュプル型関数型リアクティブ・プログラミング (実装ビットは無視)、(c) デノテーショナル・セマンティクス Haskell wikibooksのページ . デノテーショナル・セマンティクスには2つのパートがあり、2人の創始者であるChristopher StracheyとDana Scottに由来します。

この原則を守れば、FRPの精神を多少なりとも受け継いだものができるはずです。

この原則はどこで手に入れたのだろう? ソフトウェア設計において、私はいつも同じ質問をします。 デノテーショナル・セマンティクスは、この問いに対する正確なフレームワークを与えてくれ、私の美学にも合うものでした(運用的意味論や公理的意味論とは異なり、どちらも満足のいくものではありませんでした)。 そこで私は、「行動とは何か? 私はすぐに、命令型計算の時間的に離散的な性質は、ある特定のスタイルへの適応であると理解しました。 マシン 行動そのものの自然な記述というよりも。 私が考える最も単純で正確な動作の記述は、単に「(連続)時間の関数」であり、これが私のモデルです。 嬉しいことに、このモデルは連続的で決定論的な同時並行処理を簡単かつ優雅に処理することができます。

このモデルを正しく、効率的に実装するのはなかなか大変なのですが、それはまた別の話です。