【えふぇくとしすてむ】

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

💡 関数が「何をやらかすか」を型に書いて、コンパイラに監視させる仕組み
📌 このページのポイント
エフェクトシステム — 副作用を型に書いて追跡 main() [IO, Error, State] readFile() [IO] validate() [Error] counter() [State] エフェクトの種類と意味 IO ファイル・ネットワークアクセス Error 例外が発生しうる State 状態を変更する 呼び出すとエフェクトが呼び出し元に伝播 — コンパイラが漏れを検出する
関数の型にエフェクトラベルを付け、呼び出しグラフで副作用が伝播するイメージ
ひよこ ひよこ

エフェクトシステムって、ゲームのエフェクトとは関係ないんだよね?

ペンギン先生 ペンギン先生

全然違うよ!ここでの「エフェクト」は「副作用」のことで、関数がI/Oしたり、例外を投げたり、状態を変えたりすることを指すんだよ

ひよこ ひよこ

副作用って悪いものなの?

ペンギン先生 ペンギン先生

なくすのは難しいんだけど、「どこで何の副作用が起きるか」がわからないとバグが増えるんだよ。エフェクトシステムはそれを型で明示する仕組みなんだ

ひよこ ひよこ

型に書くってどういうことなの?

ペンギン先生 ペンギン先生

たとえば `readFile : String -> IO String` のように関数の型に `IO` というエフェクトラベルをつけるんだよ。これを見ただけで「この関数はI/Oをする」とわかるんだ

ひよこ ひよこ

それって呼び出した関数にも広がるの?

ペンギン先生 ペンギン先生

そうだよ!`readFile` を呼ぶ関数も `IO` エフェクトが伝播するんだよ。コンパイラが自動的に追いかけてくれるから、うっかり副作用を隠すことができないんだ

ひよこ ひよこ

エフェクトハンドラーって何なの?

ペンギン先生 ペンギン先生

エフェクトの「実装」を外側から差し込む仕組みだよ。本番では実際のI/Oを、テストではモックを使うという切り替えがエレガントにできるんだよ

ひよこ ひよこ

どんな言語で使えるの?

ペンギン先生 ペンギン先生

ScalaのZIO、KokaというMicrosoft Research製の言語、最近ではOCaml 5でも使えるようになったんだよ。関数型プログラミングとの相性がいいんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「エフェクトシステム」って出てきたら「副作用の種類を型に書いてコンパイラに管理させる仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Effect System」 = 効果システム / 副作用システム
💬 ここでの「Effect(エフェクト)」は「副作用」の意味だよ。「型システム(Type System)」の概念を拡張して、副作用を型として扱えるようにしたものだよ
← 用語集にもどる