エフェクトシステム
💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。
Flix は、言語に完全に統合された最先端の型およびエフェクトシステム (type and effect system)を備えています。Flix のエフェクトシステムは 強力かつ広範であり、エフェクト多相(effect polymorphism)、 サブエフェクティング(sub-effecting)、エフェクト除外(effect exclusion)、 純粋性リフレクション(purity reflection)、関連エフェクト(associated effects)を サポートしています。
これらの新しく刺激的な機能については、以降のページで探っていきます。
エフェクトシステムにはどのような利点があるのでしょうか。利点は数多くあります。
-
(純粋性 / Purity) 型およびエフェクトシステムは、純粋(pure)な関数と 純粋でない(impure)関数を分離します。Flix では、純粋な関数は一切の副作用を 持つことができず、同じ引数を与えられたときには同じ値を返さなければなりません。 とはいえ、純粋な関数であっても、ミュータブルなデータ構造を使って命令型スタイルで 実装することは可能です。ただし、それらのデータ構造が関数の終了時にスコープから 外れる場合に限ります。
-
(推論 / Reasoning) 型およびエフェクトシステムは、すべての関数に対して 引数と戻り値の型、そして関数の副作用を明示することを求めることで、プログラマが 自分のプログラムの動作を理解する助けになります。
-
(モジュール性 / Modularity) 型およびエフェクトシステムは、プログラムの どこでどの副作用が許可されるかをプログラマに検討させることで、モジュール性を 強制します。さらに、エフェクトは — 型と同じように — コンパイラに よって検査されるドキュメントとしての役割を果たします。
-
(エフェクトとハンドラ / Effects and Handlers) 型およびエフェクトシステムは、 代数エフェクト(algebraic effects)とハンドラ(handler)の基盤となります。 これらによって、プログラマは例外(exception)、async/await、協調的マルチタスク (cooperative multitasking)といった独自の制御構造を実装できるようになります。
-
(セキュリティ / Security) 型およびエフェクトシステムは、関数の振る舞いに ついて鉄壁の保証を提供し、プログラマが未知のコードへの信頼を高められるように します。たとえば、ある関数が純粋であれば、その関数は一切の副作用を持つことが できません。すなわち、ファイルシステムやネットワークなどにアクセスできません。 具体的な利点として、プログラムがサプライチェーン攻撃(supply chain attack)に 対してより強くなります。
-
(純粋性リフレクション / Purity Reflection) Flix 標準ライブラリ(および それを拡張する他のライブラリの作者)は、purity reflection を使って、高階関数に渡される関数引数の純粋性を検査できます。この情報を活用すれば、 プログラムの本来の意味論を保ちながら、自動並列化を実装できます。たとえば Flix では、
Set.count関数は、(a) 集合が十分に大きく、かつ (b) 渡された述語関数が純粋である 場合に、並列評価を使います。 -
(最適化 / Optimizations) Flix コンパイラは、純粋性の情報を活用して、 積極的なデッドコード除去(dead code elimination)とインライン化(inlining)を 行います。
Flix の型およびエフェクトシステムはかなり洗練されており、効果的に使うには ある程度の予備知識が必要です。次のいくつかの節では、型およびエフェクトシステムの 機能を順を追って紹介し、その使用例をいくつか示します。
先に進む前に、Flix には 3 種類のエフェクトがあることを理解しておくことが重要です。
トレイト(trait)とエフェクトがどのように相互作用するかについては、関連エフェクト の節で説明します。
ダイレクトスタイル
Flix は、伝統的な型およびエフェクトシステムを備えた、いわゆる
ダイレクトスタイル(direct-style) のプログラミング言語です。これは、
Cats Effect、Kyo、
ZIO のような、いわゆる 関数型エフェクトシステム
(functional effect systems) とは対照的です。これらのシステムは、ライブラリ
レベルのエフェクトシステム、本質的にはカスタムの IO モナドを提供します。
このアプローチにはいくつかの利点がありますが、欠点も少なくとも 2 つあります。
(a) 伝統的な型およびエフェクトシステムが提供する保証(たとえば、ある関数が
いつ純粋であるかを知ること)が一切得られないこと、そして (b) プログラムを
モナディックスタイル(monadic-style)で書かなければならず、これは煩雑である
ことです。