Skip to content

Effect型

Effect<Success, Error, Requirements>型は、不変(immutable)の値であり、遅延(lazily)的にワークフローやジョブを記述します。

この型は、プログラムのロジックをカプセル化し、成功時にはSuccess型の値を提供し、失敗時にはError型のエラーを返します。さらに、プログラムは実行するためにContext<Requirements>というコンテキストデータのコレクションを必要とします。

概念的に、Effect<Success, Error, Requirements>は以下の関数型の Effect 版(effectful version)として考えることができます:

type Effect<Success, Error, Requirements> = (
context: Context<Requirements>
) => Error | Success;

しかし、実際には Effect は関数ではありません。Effect は、同期(synchronous)、非同期(asynchronous)、並行処理(concurrent)、およびリソース管理を伴う計算をモデル化することができます。

型パラメータ

Effect型には、以下の意味を持つ三つの型パラメータがあります:

  • Success Effect が実行されたときに、成功する可能性のある値の型を表します。 この型パラメータがvoidの場合、Effect は有用な情報を生成しないことを意味し、neverの場合は Effect が永遠に実行される(または失敗するまで)ことを意味します。
  • Error Effect を実行する際に発生する可能性のある期待されるエラーを表します。 この型パラメータがneverの場合、never型の値が存在しないため、Effect は失敗しないことを意味します。
  • Requirements Effect を実行するために必要なコンテキストデータを表します。 このデータはContextという名前のコレクションに格納されます。 この型パラメータがneverの場合、Effect には要件がなく、Contextコレクションは空であることを意味します。

Effect エコシステムでは、Effectの型パラメータがそれぞれAERとして略されることがあります。これは、成功値の型AError、Requirements の略称です。

Effect値は不変であり、すべての Effect 関数は新しいEffect値を生成します。

Effect値は実際には何も実行しません。これらは効果的な相互作用をモデル化または記述するための値です。

Effectは、Effect Runtime System によって外部とのエフェクト処理を伴う相互作用(effectful interactions)として解釈されます。理想的には、これはアプリケーション内の単一のエントリポイントで発生し、そこからエフェクト処理を伴う相互作用(effectful interactions)が開始されます。たとえば、プログラムの実行開始点などです。