「高階関数(こうかいかんすう)」を新人エンジニア向けに解説

こんにちは。ゆうせいです。

今回は 「高階関数(higher-order function)」 について解説します。プログラミングを始めたばかりの人にとっては、少し難しく感じるかもしれません。でも、実はとても便利な仕組みなんです!

高階関数を理解すると、コードをもっと 簡潔に書ける ようになったり、再利用性が高まる ので、ぜひマスターしましょう。


高階関数とは?

まず、「関数」についておさらいしましょう。関数とは 「ある入力を受け取り、処理をして、結果を返すもの」 でしたね。

では、高階関数とは何でしょうか?簡単にいうと、

「関数を引数に取る関数、または関数を返す関数」

のことを指します。

具体的な例

例えば、JavaScript で以下のような関数を考えます。

function twice(f, x) {
    return f(f(x));
}

この twice という関数は、 「関数 fx に 2 回適用する」 というものです。

たとえば f(x) = x + 1 という関数を渡してみると、

function plusOne(n) {
    return n + 1;
}

console.log(twice(plusOne, 3)); // 5

となります。

このように、関数を 「データのように扱う」 のが高階関数の基本的な考え方です。


なぜ高階関数が必要なのか?

高階関数を使うメリットを紹介します。

1. コードの再利用性が向上

たとえば、配列の要素に何か処理を加えたいとき、ループを使って毎回処理を書くのは面倒です。

let numbers = [1, 2, 3, 4, 5];
let squaredNumbers = [];

for (let i = 0; i < numbers.length; i++) {
    squaredNumbers.push(numbers[i] * numbers[i]);
}

console.log(squaredNumbers); // [1, 4, 9, 16, 25]

この処理を高階関数を使って書くと、簡潔になります。

let numbers = [1, 2, 3, 4, 5];
let squaredNumbers = numbers.map(x => x * x);

console.log(squaredNumbers); // [1, 4, 9, 16, 25]

この .map() という関数は 「配列の各要素に関数を適用する」 という高階関数です。ループを書かなくても、処理が適用できます。


2. 柔軟なプログラムが書ける

高階関数を使うと、処理をパラメータとして渡せるので、汎用性が高くなります。

例えば、「偶数だけを取り出す」「3 の倍数だけを取り出す」といった処理を考えてみましょう。

通常のループを使うと、処理ごとに新しい関数を書かないといけませんが、 filter() という高階関数を使えば、同じ形で簡単に書けます。

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let evens = numbers.filter(x => x % 2 === 0);
console.log(evens); // [2, 4, 6, 8, 10]

let multiplesOfThree = numbers.filter(x => x % 3 === 0);
console.log(multiplesOfThree); // [3, 6, 9]

この .filter() という関数は、「条件を満たすものだけを取り出す」 という高階関数です。 x => x % 2 === 0x => x % 3 === 0 のような関数を渡すだけで、簡単にフィルタリングができます。


代表的な高階関数

言語によって異なりますが、よく使われる高階関数を紹介します。

高階関数説明
map各要素に関数を適用して新しい配列を作るarray.map(x => x * 2)
filter条件を満たす要素だけを抽出するarray.filter(x => x > 10)
reduce配列の要素を累積的に処理するarray.reduce((sum, x) => sum + x, 0)
sort条件を指定して並べ替えるarray.sort((a, b) => a - b)
forEach各要素に対して処理を行う(戻り値なし)array.forEach(x => console.log(x))

まとめ

高階関数とは、 「関数を引数に取る、または関数を返す関数」 のことでしたね。

メリットとしては、

  1. コードが簡潔になる
  2. 再利用性が高まる
  3. 柔軟なプログラムが書ける といった点がありました。

最初は少し難しく感じるかもしれませんが、 map()filter() を使いこなすだけでも、コードの書き方が大きく変わります。いろいろ試してみましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。