関数型プログラミングの概要

jsコード JavaScript

現代のプログラミングにおいて、関数型プログラミングは重要なパラダイムの一つとして注目されています。

JavaScriptも例外ではなく、関数型プログラミングの概念を取り入れることで、より直感的で保守しやすいコードを書くことが可能になります。

本記事は、「JavaScriptの関数型プログラミング」シリーズの第一弾として、関数型プログラミングの基本概念とその利点について紹介します。

関数型プログラミングとは

関数型プログラミング(Functional Programming)は、プログラムの設計と構築において関数を第一級市民(first-class citizen)として扱うパラダイムです。

「関数を第一級市民(first-class citizen)として扱う」とは、関数が他のデータ型(例えば、文字列や数値)と同様に扱われることを意味します。
具体的には、関数を次のように扱うことができます。

  • 変数に代入できる
  • 関数の引数として渡せる
  • 関数から戻り値として返せる

この手法では、副作用を持たない純粋関数を使用し、データの変換と組み合わせを重視します。

関数型プログラミングのメリット

関数型プログラミングには、次のようなメリットがあります。

  • 可読性の向上:
    • 関数型プログラミングは、コードを小さな再利用可能な関数に分割するため、コードの可読性が向上します。
  • テストのしやすさ:
    • 純粋関数は副作用を持たないため、テストが容易になります。
  • デバッグの効率化:
    • 関数型プログラミングでは、状態の変更が少なくなるため、デバッグが容易になります。

関数型プログラミングの基本用語

純粋関数(Pure Function)

純粋関数とは、同じ引数に対して常に同じ結果を返し、副作用がない関数のことです。
純粋関数は外部の状態に依存せず、関数内で状態を変更しません。

純粋関数の例
function add(a, b) {
    return a + b;
}

高階関数(Higher-Order Function)

高階関数とは、関数を引数として受け取るか、関数を返す関数のことです。
JavaScriptの map, filter, reduce は高階関数の代表例です。

次のサンプルは、関数を引数として受け取る map を使用したプログラムです。
2行目で、map 関数の引数として関数(アロー関数)を渡しています。

引数に関数を受け取る高階関数の使用例
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map( n => n * 2 );

console.log(doubled); // [2, 4, 6, 8, 10]

次に、関数を返す高階関数のサンプルを示します。

関数を返す高階関数の例
function createMultiplier(factor) {
    return function(number) {
        return number * factor;
    };
}

const multiplyBy3 = createMultiplier(3);
console.log(multiplyBy3(10)); // 30
console.log(multiplyBy3(5)); // 15

イミュータブル(Immutable)

「不変の」、「変更不可能な」という意味の英語形容詞で、対義語は「ミュータブル(Mutable)」です。

関数型プログラミングにおいてイミュータブルは大変重要で、一度作成されたデータは変更されないという概念です。
変更が必要な場合は、新しいデータを作成します。

関数型プログラミングの簡単な実用例

関数型プログラミングの基本を理解するために、簡単なコード例を示します。

実際に手を動かしてプログラムを作成し、動作させることで、体験による理解をお勧めします。

純粋関数を使用したサンプル

配列の要素すべての数字を二乗し、新しい配列を返す純粋関数「squareAll」を作成しています。

function squareAll( numbers ) {
    return numbers.map( n => n * n );
}

const myNumbers = [1, 2, 3, 4];
const squaredNumbers = squareAll( myNumbers );

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

高階関数を使用したサンプル

高階関数(filter)を使って、配列内の要素から偶数だけをフィルタリングするプログラムです。

function filterEven( numbers ) {
    return numbers.filter( n => n % 2 === 0 );
}

const myNumbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = filterEven( myNumbers );

console.log( evenNumbers ); // [2, 4, 6]

まとめ

本記事では、関数型プログラミングの基本概念とその利点について紹介しました。

  • 純粋関数(Pure Function): 同じ引数に対して常に同じ結果を返し、副作用がない関数です。これにより、テストやデバッグが容易になります。
  • 高階関数(Higher-Order Function): 関数を引数として受け取る、または関数を返す関数です。JavaScriptのmap, filter, reduceはその代表例です。
  • イミュータブルデータ(Immutable Data): 一度作成されたデータを変更せず、必要に応じて新しいデータを生成する概念です。これにより、予測可能なコードが書きやすくなります。

関数型プログラミングのこれらの基本原則を理解し、実際のプロジェクトに取り入れることで、コードの可読性と保守性を大幅に向上させることができます。

今後のシリーズ記事では、これらの概念をさらに深堀りし、実践的な応用方法について学んでいきます。
関数型プログラミングの魅力を最大限に引き出し、高品質な珠玉のコード(Code Gem)を目指しましょう。


本記事についての質問、誤りの指摘、ご意見ご感想などありましたら、ぜひコメント頂ければ幸いです。

最後までお読みいただき、ありがとうございます。

『詳説 JavaScript』メニューに戻る

コメント

タイトルとURLをコピーしました