logo

プログラミングにおける高階関数 📂プログラミング

プログラミングにおける高階関数

定義

プログラミングで、関数が第一級オブジェクトの場合、関数を引数に取ったり返したりする関数を高階関数と呼ぶ。その逆で、高階関数ではない関数を一階関数と呼ぶ。


  • この定義で言及されている関数は、数学で話される関数ではなく、副作用がある可能性があるコンピュータサイエンスの関数である。

説明

数学の汎関数

たまに数学で話される汎関数との文脈が似ているという言及があるが、詳細に説明する人はいないので説明する。重要ではないので、わからなければ飛ばしても良い。

数学で、ベクトル空間 $X$ の関数 $\lambda: X \to \mathbb{C}$ を汎関数と呼び、その中でも連続かつ線形の汎関数の集合、つまりデュアルスペースを $X^{\ast}$ のように表す。さらに一歩進んで $X^{\ast \ast}$ でデュアルを考えると、定義域は連続線形関数 $\lambda: X \to \mathbb{C}$ の集合 $X^{\ast}$ である。これは、プログラミングで関数を引数に取る高階関数と見なすことができる。

繰り返しになるが、もし興味があるかもしれない人のために記述したもので、重要ではない。知らなくてもいい。

マップとフォールド

詳しく読むな、大まかに読め: 関数型プログラミングを好むコーダーに、関数型プログラミングの醍醐味は何かと尋ねると、人によって意見が異なるかもしれないが、関数型プログラミングに関心がないコーダーに、最も便利な部分は何かを尋ねると、大抵、マップとリデュースと言うだろう。マップは**(1)** 関数とコレクションを受け、コレクションの各要素に関数を適用し、結果のコレクションを返す**(2)** 関数であり、フォールドは**(1)** 関数とコレクションを受け、コレクション自体に関数を適用し、結果を返す**(2)** 関数だ。

マップとフォールド(リデュース)の重要性と便利さはさておき、今重要なのはそれらが正確に何かではなく、関数の関数として説明されるということだ。手短かに言えば、「マップとリデュースは高階関数だ」となり、「関数型プログラミングの利点は、マップやリデュースが使えることだ」という、非専門家には理解しにくく、知的に見える文を使用できるようになる。