【だいすうてきエフェクト】

代数的エフェクト とは?

最終更新:
💡 「この操作をしたい」と「どう処理するか」を分ける

プログラムが要求する操作と、その操作をどう処理するかをハンドラで分ける仕組み。ハンドラは中断された計算の続きを扱い、値を渡して再開することもできる。型で追跡するか、再開を何回許すかなどは言語の実装による。

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

参考資料

← 用語集にもどる