【こうかいかんすう】

高階関数 とは?

最終更新:
💡 関数を「部品」として受け取る工場長のような関数

関数を引数として受け取ったり、関数を戻り値として返したりする関数のことで、コードの再利用性と抽象度を高める関数型プログラミングの基本概念。

📌 このページのポイント
関数を受け取る/関数を返す ① 関数を受け取る [1, 2, 3].map(x => x * 2) mapに、2倍する関数を渡す 結果:[2, 4, 6] ② 関数を返す const multiplier = n => x => x * n; multiplier(3)は3倍する関数を返す multiplier(3)(4) の結果は12
mapとmultiplierが高階関数です。渡されるコールバックが、それ自体で高階関数とは限りません。
ひよこ ひよこ
関数に関数を渡すってどういうこと?
ペンギン先生 ペンギン先生
たとえば [1, 2, 3].map(x => x * 2) では、mapに「各要素を2倍する関数」を渡しているよ。結果は新しい配列 [2, 4, 6]。渡す関数を変えれば、各要素に行う処理を差し替えられるんだ。
ひよこ ひよこ
map、filter、reduceはどう違うの?
ペンギン先生 ペンギン先生
mapは各要素を変換した新しい配列を、filterは条件に合う要素の配列を作るよ。reduceは前の計算結果を次へ渡しながら1つの値にまとめる。たとえば [1, 2, 3].reduce((a, b) => a + b, 0) は合計の6になるんだ。
ひよこ ひよこ
渡す関数も高階関数なの?
ペンギン先生 ペンギン先生
渡す側の関数は、この場面ではコールバックと呼ぶよ。x => x * 2 は数を受け取って数を返すので、それ自体は高階関数ではない。関数を引数に受け取るmapのほうが高階関数なんだ。
ひよこ ひよこ
関数を返す例もある?
ペンギン先生 ペンギン先生
const multiplier = n => x => x * n; なら、multiplier(3) は引数を3倍する関数を返すよ。その関数に4を渡すと12になる。関数を返すmultiplierも、高階関数の例だね。
ひよこ ひよこ
それがクロージャなの?
ペンギン先生 ペンギン先生
返された関数が、作られた場所の変数nを参照できる仕組みはクロージャと関係するよ。クロージャは関数とその周囲の変数への参照の組み合わせ。高階関数は関数を受け取るか返すかという分類なので、同じ意味の言葉ではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「高階関数」って出てきたら「関数を受け取ったり返したりする関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「higher-order function」 = 高次の関数
💬 数学の「高階」と同じで、関数そのものを操作対象にする一段上の抽象レベルの関数

参考資料

← 用語集にもどる