TL;DR

プログラミングでは、式の評価による主たる作用とは別に起こる作用のこと。グローバル変数の変更や、ファイルの読み書きなどの I/O がこれにあたる。

なぜ必要か

副作用は外部依存のリスクにつながる。純粋関数を増やし、副作用を分離すると、予測可能でテストしやすい部品を組み合わせて作れる。

仕組み

Wikipedia によると、副作用の例には、グローバル変数や静的ローカル変数の変更、ファイルの読み書きなどの I/O の実行がある。参照透過な機能は状態を持たないので、副作用とは縁がない。関数型言語では、原則として副作用を存在しないものとみなし、モナドなどの手法で抽象化する。

例

  • Effect の Effect<A, E, R> 型は、副作用を値のように扱えるようにする
  • エフェクトシステムは、コードで起こりうる副作用を分類してタグ付けし、実行より前に分かるようにする
  • Domain Modeling Made Functional の第 3 章は、I/O をワークフローの端に追いやる
  • Svelte では、副作用を $effect で書く

注意点

副作用をゼロにすることはできない。そのため、副作用をなくすのではなく、純粋関数を増やして副作用を分離することに取り組む。

関連

出典