関数型リアクティブプログラミングの元の定式化は、 Conal Elliott とPaul Hudak による ICFP 97 論文「Functional Reactive Animation」に記載されています。[ 1 ]
FRPは1997年の導入以来、様々な形態をとってきた。多様性の1つの軸は、離散的セマンティクスと連続的セマンティクスである。もう1つの軸は、FRPシステムを動的に変更できるかどうかである。[ 2 ]
連続 FRPの初期の定式化では、連続意味論が用いられ、プログラムの意味にとって重要でない多くの操作上の詳細を抽象化することを目的としていました。[ 3 ] この定式化の主な特性は次のとおりです。
連続的な時間の中で変化する値をモデル化する。これらは「挙動」と呼ばれ、後に「シグナル」と呼ばれる。 特定の時点において発生する「イベント」をモデル化する。 システムは、様々な事象に応じて変更することができ、これは一般的に「スイッチング」と呼ばれる。 サンプリングレートなどの評価の詳細を反応モデルから分離する。 副作用の ない言語における FRP のこの意味論的モデルは、通常、連続関数の観点から、そして通常、時間に関して表現されます。[ 4 ] この定式化は、指示的連続時間プログラミング (DCTP) とも呼ばれます。[ 5 ]
離散 イベント駆動型FRPやElm のバージョン0.17以前のバージョンなどの定式化では、更新が離散的でイベント駆動型であることが求められます。[ 6 ] これらの定式化は、ロボット工学やWebブラウザなどの環境で効率的に実装できるシンプルなAPIを持つセマンティクスに焦点を当て、実用的なFRPを推進してきました。[ 7 ]
これらの定式化では、行動とイベントの概念が、常に現在の値を持つが離散的に変化する信号に組み合わされるのが一般的である。[ 8 ]
インタラクティブFRP 入力から出力への通常のFRPモデルは、対話型プログラムには適していないことが指摘されている。[ 9 ] 入力から出力へのマッピング内でプログラムを「実行」する機能がないため、以下のいずれかの解決策を使用する必要があるかもしれない。
出力として現れるアクションのデータ構造を作成します。アクションは外部のインタプリタまたは環境によって実行される必要があります。これは、Haskellの元のストリーム 入出力 (I/O) システムのすべての困難を継承します。[ 10 ] Arrowized FRP を使用し、アクションを実行できる矢印を埋め込みます。アクションには識別子を持たせることもできます。これにより、たとえば個別の可変ストアを維持できます。これは、Fudgets ライブラリ[ 11 ]や、より一般的にはモナドストリーム関数 [ 12 ] [ 13 ] で採用されているアプローチです。 この斬新なアプローチは、アクションを今すぐ(IOモナド内で)実行できるようにする一方で、その結果の受信を後回しにするというものです。[ 14 ] これはイベントモナドとIOモナド間の相互作用を利用し、より式指向のFRPと互換性があります。 planNow :: Event ( IO a ) -> IO ( Event a )
実装上の問題 FRPシステムには、プッシュ型とプル型の2種類があります。プッシュ型システムは、イベントを受け取り、信号ネットワークを通して結果を生成します。一方、プル型システムは、結果が要求されるまで待機し、ネットワークを逆方向にたどって要求された値を取得します。
Yampaなどの一部のFRPシステムはサンプリング方式を採用しており、信号ネットワークがサンプルをプルします。この方式には欠点があり、ネットワークは入力の変化を把握するために、1つの計算ステップの期間分待機する必要があります。サンプリングはプル型FRPの一例です。
Hackage の Reactive および Etage ライブラリは、プッシュプル FRP と呼ばれるアプローチを導入しました。このアプローチでは、純粋に定義されたストリーム (時間付きの固定イベントのリストなど) 上の次のイベントが要求されたときにのみ、そのイベントが構築されます。これらの純粋に定義されたストリームは、Haskell の遅延リストのように機能します。これがプルベースの部分です。プッシュベースの部分は、システム外部のイベントが取り込まれる場合に使用されます。外部イベントはコンシューマーにプッシュされるため、コンシューマーはイベントが発行された瞬間にそのイベントを知ることができます。
参考文献 ↑ エリオット、コナル;フダック、ポール。「機能的リアクティブアニメーション」。機能的リアクティブアニメーション 。ICFP '97 。 2018年 7月14日 取得 。 ↑ Nilsson, Henrik; Courtney, Antony; Peterson, John (2011年2月) [2002]、「関数型リアクティブプログラミング、続き」、 Haskellワークショップ (PDF) ↑ エリオット、コナル;ハダック、ポール(1997) 「機能的リアクティブアニメーション」 、 ICFP ↑ Courtney, Antony; Elliott, Conal (2011年2月) [2001]、 「真に機能的なユーザーインターフェース」 、 Haskellワークショップ 、イェール大学 ↑ エリオット、コナル(2014)、 「指示的設計」 (PDF) 、 LambdaJam 、 2023年 5月5日 取得 ↑ Taha, Walid; Wan, Zhanyong; Hudak, Paul (2002), "Event-Driven FRP", PADL (PDF) , Yale, 2013年9月28日に オリジナル (PDF)からアーカイブ済み、 2013年9月23日 取得 ↑ Czaplicki, Evan; Chong, Stephen (2013), "Asynchronous Functional Reactive Programming for GUIs" , PLDI , Harvard ↑ Wan, Zhanyong; Taha, Walid; Hudak, Paul (2011年2月)、「リアルタイムFRP」、 ICFP (PDF) 、 2013年9月28日に オリジナル (PDF)からアーカイブ、 2013年9月23日 取得 ↑ エリオット、コナル(2008年12月9日)。 「なぜ従来のFRPはインタラクティブな動作に適合しないのか」 。 2022年10月12日にオリジナルから アーカイブ済み。 ↑ ボーニング、アラン。 「純粋関数型言語における入出力」 (PDF) 。 2022年4月28日にオリジナルから アーカイブ (PDF) 。 ↑ Carlsson, Magnus; Hallgren, Thomas (1998). "Fudgets – グラフィカルユーザーインターフェースへの応用を伴う純粋関数プロセス" (PDF) 。 2022年10月15日にオリジナルから アーカイブされました (PDF) 。 ↑ Perez, Ivan; Barenz, Manuel; Nilsson, Henrik (2016年7月)、「関数型リアクティブプログラミングのリファクタリング」、 Haskellシンポジウム (PDF) 1 2 "Data.MonadicStreamFunction" . Hackage . 2025-08-30 に取得. ↑ アッツェ・ファン・デル・プローグ。クラッセン、コーエン。 「実践原理FRP」 (PDF) 。 2015 年 7 月 1 日の オリジナル (PDF) からアーカイブされました 。 2015 年 7 月 24 日 に取得 。 ↑ Czaplicki, Evan (2012年4月), Elm: Concurrent FRP for Functional GUIs (PDF) (学位論文), ハーバード大学, 2016年6月4日に オリジナル (PDF)からアーカイブ済み , 2015年2月17日取得 {{citation}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)↑ Czaplicki, Evan. "A Farewell to FRP" . elm . 2018年 7月14日 取得 . ↑ 「Sodium FRPライブラリ(GitHub)」 。 2024年 10月5日 取得 。 ↑ Van den Vonder, Sam; Renaux, Thierry; Oeyen, Bjarno; De Koster, Joeri; De Meuter, Wolfgang (2020), "リアクティブプログラミングにおける厄介なチームへの取り組み:アクター・リアクターモデル", Leibniz International Proceedings in Informatics (LIPIcs) , vol. 166, pp. 19:1–19:29, doi : 10.4230/LIPIcs.ECOOP.2020.19 , ISBN 9783959771542 S2CID 260445152 ↑ Van den Vonder, Sam; Renaux, Thierry; De Meuter, Wolfgang (2022), "分散リアクティブプログラムにおけるトポロジーレベルのリアクティビティ:Flocksを使用したリアクティブな知り合い管理", The Art, Science, and Engineering of Programming 、第 6巻、pp. 14:1–14:36、 arXiv : 2202.09228 、 doi : 10.22152/programming-journal.org/2022/6/14 、 S2CID 246979565 ↑ 「ReactiveX」 . ReactiveX.io . 2022年 7月3日 取得 。