【だいすうてきエフェクト】
代数的エフェクト とは?
最終更新:
💡 「この操作をしたい」と「どう処理するか」を分ける
プログラムが要求する操作と、その操作をどう処理するかをハンドラで分ける仕組み。ハンドラは中断された計算の続きを扱い、値を渡して再開することもできる。型で追跡するか、再開を何回許すかなどは言語の実装による。
📌 このページのポイント
- 操作を定義し、計算の中からその操作を要求する
- 計算を囲むハンドラが、要求の処理方法を決める
- 中断された計算の続きを扱い、値を渡して再開できる
- 型での追跡や再開回数の制限は、言語によって異なる
代数的エフェクトって、何を分ける仕組み?
「この操作をしたい」という要求と、「どう処理するか」を分けるんだ。例えば値を取得する操作を要求し、計算を囲むハンドラが値を用意する。要求側の処理を変えずに、別のハンドラで動かすこともできるよ
例外のtry/catchとは、どう違うの?
ハンドラは、要求した場所から先の計算の続きを受け取れるんだ。値を渡して続きを再開できるので、通常の例外処理より広い制御を表せる。必ず再開するわけではなく、その扱いはハンドラと実装によるよ
操作を宣言すれば、関数は純粋になるの?
どんな言語で使えるの?
KokaやOCamlなどに実装があるよ。Kokaは関数の型でエフェクトを追跡する。一方、OCaml 5.4のハンドラでは、全要求が処理されることを型で保証しない。再開できる回数なども違うので、使う言語の仕様を確認するんだ
モナドやasync/awaitより、必ず簡単になる?
使い方と実装によるよ。ハンドラで状態や非同期の制御を表し、通常の関数のような書き方にできる場合がある。でもモナドより常に簡単とは言えないし、各言語のasync/awaitがそのままエフェクトハンドラというわけでもないんだ
まとめ:ざっくりこれだけ覚えればOK!
「代数的エフェクト」って出てきたら「操作の要求と処理方法を分け、計算の続きをハンドラで扱う仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Algebraic Effects」 = 操作を代数的に扱うエフェクト
💬 effectは作用という意味だよ。代数的エフェクトは操作を定義して扱う考え方で、実際の処理を決めるハンドラと組み合わせて使うんだ