Chapter 11

2.5 純粋関数と非純粋関数

さのたけと
さのたけと
2021.05.04に更新

C++ やその他の命令型言語において関数と呼ばれるものは,数学者が関数と呼ぶものとは異なる.数学における関数は,ただの値から値への対応だ.

プログラムで数学的な関数を実装することはできる:そのような関数は,入力値を与えると出力を計算する.与えられた数の自乗を返す関数は,入力値を自身に掛ける実装となるであろう.その関数は呼び出しのたびにこれを繰り返し,同じ入力値に対しては同じ出力を返すことが保障されている.数の自乗は,月の満ち欠けによって値が変わったりしない.

さらに,数の自乗を計算することは,あなたの飼い犬に好物の餌を与えるような副作用を持たない.そんなことをする "関数" を,数学的な関数としてモデル化するのは難しい.

プログラミング言語において,同じ入力に対して必ず同じ結果を返し,他の副作用を持たないものは 純粋関数 (pure function) と呼ばれる.Haskell のような純粋関数型言語では,すべての関数は純粋である.そのために,これらの言語は表示的意味論を与え,圏論によるモデル化を行うことが比較的容易だ.その他の言語については,純粋な部分に制限したり,副作用について個別に扱うことはできる.後々我々は,モナドを用いることで純粋関数だけを用いて全ての副作用がモデル化できることを見る.従って,数学的な関数のみに話を限定することで理論的に失うものはない.

(和訳:@taketo1024