エフェクトシステム


Effect_system

に 、
コンピューティングにおいて、エフェクトシステムは、副作用などのコンピュータプログラムの計算効果を記述する正式なシステムです。エフェクトシステムを使用して、プログラムの考えられるエフェクトのコンパイル時チェックを提供できます。
エフェクトシステムは、タイプの概念を拡張して、エフェクトの種類と領域で構成される「エフェクト」コンポーネントを持ちます。エフェクトの種類は何が行われているかを示し、リージョンはそれが行われていること(パラメーター)を示します。
エフェクトシステムは通常、型システムの拡張です。この場合、「タイプとエフェクトシステム」という用語が使用されることが多くの場合、値のタイプは、その効果とともにタイプとして示されます。効果。タイプコンポーネントと効果コンポーネントの両方が特定の領域に言及します(たとえば、可変メモリセルのタイプは、セルが存在するメモリ領域のラベルによってパラメータ化されます)。「代数効果」という用語は、型システムに由来します。
エフェクトシステムは、特定の内部的に不純な定義の外部純度を証明するために使用できます。たとえば、関数がメモリの領域を内部的に割り当てて変更するが、関数のタイプがその領域に言及していない場合、対応する効果は関数の効果。

コンテンツ 1 例 2 実装
2.1 コア機能 2.2 フルサポート 2.3 部分的なサポートとプロトタイプ
3 参考文献
3.1 教科書の章 3.2 概要論文
4 参考文献


エフェクトシステムで説明できる動作の例には、次のものが
メモリの読み取り、書き込み、または割り当て:エフェクトの種類は、読み取り、書き込み、割り当て、または解放であり、リージョンは、割り当てが実行されたプログラムのポイントです(つまり、割り当てが実行された各プログラムポイントには、一意のラベルとリージョンが割り当てられます。情報はデータフローに沿って静的に伝播されます)。メモリを操作するほとんどの関数は、実際には領域変数で多形になります。たとえば、メモリ内の2つの場所を交換する関数のタイプはforall r1 r2, unit ! {read r1, read r2, write r1, write r2}です。
ファイルなどのリソースの操作:たとえば、エフェクトの種類は、開いたり、読み取ったり、閉じたりすることができます。また、リージョンは、リソースが開かれるプログラムのポイントです。
継続と長いジャンプを伴うコントロール転送:エフェクトの種類はgoto(つまり、コードの一部がジャンプを実行する可能性があります)とcomefrom(つまり、コードの一部がジャンプのターゲットになる可能性があります)であり、領域はポイントを示します。ジャンプを実行できるプログラム。
プログラマーの観点からは、エフェクトは、特定のアクションの実装(方法)を実行するアクションの仕様から分離できるため、便利です。たとえば、名前の確認の効果は、コンソールから読み取るか、ウィンドウをポップするか、または単にデフォルト値を返すことができます。制御フローは、 yield(実行が継続するという点)とthrow(未処理の効果が処理されるまで伝播するという点)のブレンドとして説明できます。

実装

コア機能
Kokaは、代数効果ハンドラーを主な機能とする静的に型付けされた 関数型プログラミング言語です。
Effは、代数効果ハンドラーを中心とした静的に型付けされた関数型プログラミング言語です。
Unisonは、型システムのコア部分として代数効果ハンドラー(言語では「能力」と呼ばれる)を備えた静的に型付けされた関数型プログラミング言語です。

フルサポート
Haskellは静的に型付けされた関数型プログラミング言語であり、エフェクトのエンコードを可能にするいくつかのパッケージが

部分的なサポートとプロトタイプ
Scala 3.1は、静的に型付けされた関数型のオブジェクト指向プログラミング言語であり、機能の形で、例外CanThrowに限定された効果を実験的にサポートしています。
Javaは、静的に型付けされたオブジェクト指向プログラミング言語です。チェックされた例外は、エフェクトシステムの比較的限定された例です。エフェクトの種類は1つだけです— throws—使用可能であり、値で再開する方法はありません。また、関数がカスタムを実装しない限り、関数(メソッドのみ)で使用することはできません@FunctionalInterface。
JavaScriptは動的型付け言語であり、代数効果を実装する提案が

参考文献
^ Albin。、Turbak、Franklyn(2010)。プログラミング言語の設計概念。PHIラーニング。ISBN 978-81-203-3996-5。OCLC1261053520 。_ ^ アブラモフ、ダン。「私たちの残りのための代数効果」。overreacted.io。
^ 「甲賀マニュアル」。koka-lang.github.io。
^ Pretnar、Matija(2021-12-07)、Eff、2021-12-11を取得
^ 「ユニゾン言語」。www.unisonweb.org 。
^ ベラ、ジョシュ
“joshvera / freemonad-ベンチマーク”。GitHub。さまざまな無料のモナド実装のパフォーマンスを比較するベンチマーク。
^ 「CanThrow能力」。Scalaドキュメント。
^ 「例外をスローするJava8 Lambda関数?」。スタックオーバーフロー。
^ マカバイ家、ブルーノ
“macabeus / js-proposal-algebraic-effects: JSに代数効果を持たせましょう”。GitHub。

教科書の章
ハンキン、クリス; ニールソン、フレミング; ニールソン、ハンネ・リース(1999)。プログラム分析の原則。ベルリン:スプリンガー。ISBN 978-3-540-65410-0。
ギフォード、デビッド; ターバック、フランクリンA。; シェルドン、マークA.(2008)。「16」。プログラミング言語の設計概念。マサチューセッツ州ケンブリッジ:MIT Press ISBN 978-0-262-20175-9。

概要論文
ニールソン、フレミング; ニールソン、ハンネ・リース(1999)。タイプとエフェクトシステム。正しいシステム設計:最近の洞察と進歩。コンピュータサイエンスの講義ノート。巻 1710.Springer-Verlag。pp。114–136  。_ 土井:10.1007 / 3-540-48092-7_6。ISBN 978-3-540-66624-0。

参考文献
マリノ、ダニエル; ミルスタイン、トッド(2008)。ジェネリックタイプとエフェクトシステム (PDF)。言語の設計と実装におけるタイプに関する第4回国際ワークショップの議事録。ACM。p。39. CiteSeerX10.1.1.157.8373 。_ 土井:10.1145 /1481861.1481868。ISBN 9781605584201。
Lucassen、John M。; ギフォード、デビッドK.(1988)。ポリモーフィックエフェクトシステム。プログラミング言語の原理に関する第15回ACMSIGPLAN-SIGACTシンポジウムの議事録。ACM。pp。47–57。CiteSeerX10.1.1.73.4916 。_ 土井:10.1145 /73560.73564。ISBN 978-0897912525。