関数型リアクティブプログラミング( FRP ) は、関数型プログラミングの構成要素( map、Reduce、Filterなど) を使用したリアクティブプログラミング(非同期データフロープログラミング)のプログラミングパラダイムです。FRP は、時間を明示的にモデル化することでこれらの問題を簡素化することを目的として、グラフィカルユーザーインターフェイス(GUI)、ロボット工学、ゲーム、音楽のプログラミングに使用されてきました。 [引用が必要]
FRPの配合
関数型リアクティブプログラミングの元々の定式化は、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]で採用されているアプローチです。
- この新しいアプローチは、アクションを今すぐ(IOモナド内で)実行できるようにしながら、その結果の受け取りを後回しにすることです。[13]これは、イベントとIOモナド間の相互作用を利用し、より式指向のFRPと互換性があります。
planNow ::イベント( IO a ) -> IO (イベントa )
実装上の問題
FRP システムには、プッシュベースとプルベースの 2 種類があります。プッシュベースのシステムは、イベントを受け取り、シグナル ネットワークを通じてプッシュして結果を取得します。プルベースのシステムは、結果が要求されるまで待機し、ネットワークを逆方向に処理して、要求された値を取得します。
Yampa などの一部の FRP システムでは、サンプルが信号ネットワークによってプルされるサンプリングを使用します。このアプローチには欠点があります。ネットワークは、入力の変更を学習するために、1 つの計算ステップの期間まで待機する必要があります。サンプリングは、プルベースの FRP の一例です。
Hackageの Reactive および Etage ライブラリは、プッシュ プル FRP と呼ばれるアプローチを導入しました。このアプローチでは、純粋に定義されたストリーム (時間付きの固定イベントのリストなど) 上の次のイベントが要求された場合にのみ、そのイベントが構築されます。これらの純粋に定義されたストリームは、Haskellの遅延リストのように動作します。これがプルベースの半分です。プッシュベースの半分は、システム外部のイベントが取り込まれるときに使用されます。外部イベントはコンシューマーにプッシュされるため、コンシューマーはイベントが発行された瞬間にそのイベントについて知ることができます。
実装
次のような多くのプログラミング言語の実装が存在します。
- Yampa は、SDL、SDL2、OpenGL、HTML DOM をサポートする、矢印型の効率的な純粋なHaskell実装です。
- Elm言語はかつてFRPをサポートしていましたが[14]、現在は別のパターンに置き換えられています。[15]
- reflex は、Web ブラウザーのホストであるDocument Object Model (DOM)、Simple DirectMedia Layer (SDL)、および Gloss を備えた、Haskell での効率的なプッシュ プル FRP 実装です。
- reactive-banana は、Haskell でのターゲットに依存しないプッシュ FRP 実装です。
- netwire と varying は、Haskell での矢印付きプル FRP 実装です。
- Flapjax は、 JavaScriptでの動作イベント FRP 実装です。
- React は関数型リアクティブプログラミング用のOCamlモジュールです。
- Sodiumは、Java、TypeScript、C#などのいくつかの言語向けの特定のユーザーインターフェイス(UI)フレームワークに依存しないプッシュFRP実装です。[16]
- Dunai は、Classic FRP と Arrowized FRP をサポートするモナド ストリーム関数を使用した Haskell の高速実装です。
- ObservableComputations は、クロスプラットフォームの.NET実装です。
- Stellaはアクターモデルベースのリアクティブ言語であり、「アクター」と「リアクター」のモデルを示し、命令型コードとリアクティブコードを組み合わせることによる問題を回避することを目的としています(アクターとリアクターを分離することにより)。[17]アクターは分散リアクティブシステムでの使用に適しています。[18]
- TidalCycles は、 Haskell言語に埋め込まれた、音楽パターン用の純粋な FRP ドメイン固有言語です。
JavaScript実装rxjsによって普及したReactiveXは関数型かつリアクティブだが、関数型リアクティブプログラミングとは異なる。[19]
参照
参考文献
- ^ Elliott, Conal; Hudak, Paul. 「Functional Reactive Animation」.機能的リアクティブアニメーション. ICFP '97 . 2018年7月14日閲覧。
- ^ Nilsson, Henrik; Courtney, Antony; Peterson, John (2011 年 2 月) [2002]、「関数型リアクティブ プログラミング (続)」、Haskell ワークショップ(PDF)
- ^ エリオット、コナル、ハダック、ポール (1997)、「機能的リアクティブアニメーション」、ICFP
- ^ コートニー、アントニー、エリオット、コナル(2011年2月)[2001]、「真に機能的なユーザーインターフェイス」、Haskellワークショップ、イェール大学
- ^ Elliot, Conal (2014)、「Denotational Design」(PDF)、LambdaJam 、2023年5月5日閲覧
- ^ Taha, Walid; Wan, Zhanyong; Hudak, Paul (2002)、「Event-Driven FRP」、PADL (PDF) 、Yale、 2013-09-28 のオリジナル(PDF)からアーカイブ、 2013-09-23取得
- ^ Czaplicki, Evan; Chong, Stephen (2013)、「GUI 向け非同期機能リアクティブプログラミング」、PLDI、ハーバード
- ^ Wan, Zhanyong; Taha, Walid; Hudak, Paul (2011 年 2 月)、「Real-Time FRP」、ICFP (PDF) 、 2013 年 9 月 28 日のオリジナル(PDF)からアーカイブ、 2013 年 9 月 23 日に取得
- ^ Elliott, Conal (2008年12月9日). 「なぜ古典的なFRPはインタラクティブな動作に適合しないのか」。2022年10月12日時点のオリジナルよりアーカイブ。
- ^ Borning, Alan. 「純粋関数型言語におけるI/O」(PDF) 。 2022年4月28日時点のオリジナルよりアーカイブ(PDF) 。
- ^ Carlsson, Magnus; Hallgren, Thomas (1998). 「Fudgets – Purely Functional Processes with applications to Graphical User Interfaces」(PDF)。2022年10月15日時点のオリジナルよりアーカイブ(PDF)されています。
- ^ Perez, Ivan; Barenz, Manuel; Nilsson, Henrik (2016 年 7 月)、「関数型リアクティブ プログラミングのリファクタリング」、Haskell シンポジウム(PDF)
- ^ アッツェ・ファン・デル・プローグ;クラッセン、コーエン。 「実践原理FRP」(PDF)。2015 年 7 月 1 日のオリジナル(PDF)からアーカイブされました。2015 年 7 月 24 日に取得。
- ^ Czaplicki, Evan (2012 年 4 月)、Elm: 機能的 GUI のための並行 FRP (PDF) (論文)、ハーバード、 2016 年 6 月 4 日のオリジナル(PDF)からアーカイブ、 2015 年 2 月 17 日に取得
{{citation}}: CS1 メンテナンス: 場所が見つかりません 発行者 (リンク) - ^ Czaplicki, Evan. 「FRP への別れ」elm . 2018 年7 月 14 日閲覧。
- ^ 「Github 上のナトリウム FRP ライブラリ」 。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 を使用したリアクティブ知人管理」、プログラミングの芸術、科学、工学、第 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日閲覧。
