TL;DR
プログラミングでは、式の評価による主たる作用とは別に起こる作用のこと。グローバル変数の変更や、ファイルの読み書きなどの I/O がこれにあたる。
なぜ必要か
副作用は外部依存のリスクにつながる。純粋関数を増やし、副作用を分離すると、予測可能でテストしやすい部品を組み合わせて作れる。
仕組み
Wikipedia によると、副作用の例には、グローバル変数や静的ローカル変数の変更、ファイルの読み書きなどの I/O の実行がある。参照透過な機能は状態を持たないので、副作用とは縁がない。関数型言語では、原則として副作用を存在しないものとみなし、モナドなどの手法で抽象化する。
例
- Effect の
Effect<A, E, R>型は、副作用を値のように扱えるようにする - エフェクトシステムは、コードで起こりうる副作用を分類してタグ付けし、実行より前に分かるようにする
- Domain Modeling Made Functional の第 3 章は、I/O をワークフローの端に追いやる
- Svelte では、副作用を
$effectで書く
注意点
副作用をゼロにすることはできない。そのため、副作用をなくすのではなく、純粋関数を増やして副作用を分離することに取り組む。