【えふぇくとしすてむ】

エフェクトシステム とは?

最終更新:
💡 返す値に加え、関数が行う操作も見えるようにする

関数が行い得る入出力・例外・状態操作などを、型とともに静的に追跡する仕組み。何を検査・保証できるかは、言語やシステムの設計によって異なる。

📌 このページのポイント
返す値と、行う操作を区別する計算する関数整数を返す入出力なしの例表示する関数整数を返す画面への出力あり戻り値が同じでも、操作は違う行う操作も、型と一緒に追跡する
副作用を区別する考え方。具体的な型の表記や保証は言語で異なります。ハンドラーによる処理と静的な検査は別です。
ひよこ ひよこ
関数の型だけでは、何が足りないの?
ペンギン先生 ペンギン先生
文字列を返す関数でも、ただ文字を組み立てるのか、ファイルを読むのか、例外を起こし得るのかが違うよね。エフェクトシステムは、そうした操作も静的に扱う仕組み。副作用という名前でも、入出力は必要な仕事で、悪い動作という意味ではないんだ。
ひよこ ひよこ
型に、どんなことを書くの?
ペンギン先生 ペンギン先生
言語によるよ。Kokaでは、画面への出力を含む関数にconsoleなどのエフェクトが付く。効果がないtotal、例外のexnなどもある。効果の名前や書き方は、言語ごとに確認しよう。
ひよこ ひよこ
呼び出す側にも、関係がある?
ペンギン先生 ペンギン先生
あるよ。処理の中で効果のある関数を呼べば、その効果をどう扱うかが呼び出す側にも関係する。Kokaは効果を推論し、複数の効果を組み合わせる仕組みを説明している。ただし、すべての言語で同じ保証があるわけではないよ。
ひよこ ひよこ
エフェクトハンドラーとは、同じもの?
ペンギン先生 ペンギン先生
関連するけれど別だよ。ハンドラーは要求された操作をどう処理するかを指定する仕組み。静的なエフェクトシステムは、どんな効果があり得るかを追跡する仕組み。OCamlのハンドラーは、未処理の効果がないことをコンパイラが保証するものではないんだ。
ひよこ ひよこ
使えば、予期しない動作は全部防げる?
ペンギン先生 ペンギン先生
検査対象の効果を扱う助けにはなるけれど、すべてのバグや実行結果を保証するわけではないよ。Kokaの公式資料は研究言語で開発中とも説明している。採用する仕組みの検査範囲、ハンドラーやライブラリの動作、実行時の失敗を確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「エフェクトシステム」って出てきたら「関数が行う操作も、型と一緒に追跡する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Effect System」 = 効果システム / 副作用システム
💬 ここでの「Effect(エフェクト)」は「副作用」の意味だよ。「型システム(Type System)」の概念を拡張して、副作用を型として扱えるようにしたものだよ

参考資料

← 用語集にもどる