プログラミングをやっていると、「関数に副作用がある」とか「副作用がない」あるいは「純粋である」という話をちょいちょい耳にする。そして、「外界の状態を読み取るけど変更はしない関数」、例えば
function getTime() {
return Date.now();
}
のような関数に副作用があるか?みたいな議論が始まったりする。
くだらない議論だ。
何か概念を定義するときは、それが「役に立つ」場面を提示できる必要がある。「関数の副作用」を定義するときは、「関数の副作用」がわかったときに何をしたいのかをはっきりさせる必要がある。「関数のどういう側面に注目したいか」を決めずに「副作用の有無」を論じるのはナンセンスだ。
ここでは、言語処理系(コンパイラー)を実装する者の立場で、関数の副作用について論じてみたい。
続きを読む