JavaScriptのカリー化

王林
王林オリジナル
2024-07-18 02:38:20717ブラウズ

JavaScript Currying

カリー化は、複数の引数を持つ関数を、それぞれが 1 つの引数を取る関数のシーケンスに変換する関数プログラミングの強力な概念です。この手法により、よりモジュール化された再利用可能なコードが可能になります。 JavaScript では、カリー化はさまざまな方法で実装できます。このブログでは、カリー化を検討し、例を示し、n 個の引数のカリー化を実現するためのさまざまな方法について説明します。

カリー化とは何ですか?

カリー化は、複数の引数を取る関数を、それぞれが 1 つの引数を取る一連の関数に変換するプロセスです。たとえば、関数 f(a, b, c) は f(a)(b)(c) に変換できます。

カリー化を使用する理由

  • 部分適用: カリー化により、関数の一部の引数を修正し、新しい関数を作成できます。
  • 高階関数: 他の関数を引数として受け取ったり、他の関数を返したりする高階関数の使用が容易になります。
  • コードの再利用性: カリー化された関数は、再利用可能で構成可能です。
  • 関数の合成: カリー化により、より優れた関数の合成が可能になります。複雑な関数は、より単純な関数を組み合わせて構築され、よりクリーンで保守しやすいコードにつながります。

簡単なカレーの例

カリー化がどのように機能するかを理解するために、基本的な例から始めましょう。

カリー化されていない関数

これは 3 つの数値を加算する単純な関数です:

function add(a, b, c) {
  return a + b + c;
}

console.log(add(1, 2, 3)); // Output: 6

説明: この関数 add は 3 つの引数 a、b、c を受け取り、それらの合計を返します。 add(1, 2, 3) を呼び出すと、6 が返されます。


カリー関数

次に、この関数をカリー化したバージョンに変換しましょう:

function curryAdd(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    };
  };
}

console.log(curryAdd(1)(2)(3)); // Output: 6

説明:curryAdd 関数は引数 a を受け取り、引数 b を取る関数を返し、その関数は引数 c を取る関数を返します。最後の関数は、a、b、c の合計を返します。 curryAdd(1)(2)(3) を呼び出すと、ネストされた関数を通じて引数 1、2、3 が順番に渡され、結果は 6.

になります。

アロー関数を使用したカリー化

JavaScript のアロー関数は、カリー化された関数を作成する簡潔な方法を提供します。

const curryAddArrow = a => b => c => a + b + c;

console.log(curryAddArrow(1)(2)(3)); // Output: 6

説明:curryAddArrow 関数は、引数 a を受け取り、b を受け取る別のアロー関数を返し、さらに c を受け取る別のアロー関数を返すアロー関数です。最後のアロー関数は、a、b、c の合計を返します。 curryAddArrow(1)(2)(3) を呼び出すと、ネストされたアロー関数を通じて引数 1、2、3 が順番に渡され、結果は 6.

になります。

使用事例

1.設定機能

カリー化の一般的な使用例は、構成関数です。たとえば、ログ レベルとメッセージ形式を個別に構成するログ ユーティリティを作成していると想像してください。

function logger(level) {
  return function (message) {
    console.log(`[${level}] ${message}`);
  };
}

const infoLogger = logger('INFO');
const errorLogger = logger('ERROR');

infoLogger('This is an info message');
errorLogger('This is an error message');

2. 文字列フォーマッター

カリー化を使用して文字列フォーマッタを作成できる実際の例を考えてみましょう。このフォーマッタを使用すると、プレフィックスとサフィックスを個別に設定できます。

function formatter(prefix) {
  return function (suffix) {
    return function (str) {
      return `${prefix}${str}${suffix}`;
    };
  };
}

const htmlFormatter = formatter('<b>')('</b>');
console.log(htmlFormatter('Hello')); // <b>Hello</b>

const parensFormatter = formatter('(')(')');
console.log(parensFormatter('123')); // (123)

最新の JavaScript ライブラリでのカリー化

カリー化は、Lodash や Ramda などの最新の JavaScript ライブラリでよく使用されます。たとえば、Lodash では、_.curry メソッドを使用して、カリー化された関数を簡単に作成できます。

const _ = require('lodash');

function multiply(a, b, c) {
  return a * b * c;
}

const curriedMultiply = _.curry(multiply);

console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24

N 個の引数を使用したカリー化

n 個の引数を追加する再帰関数を使用してカリー化する以下の例を見てみましょう。カリー化を使用して、任意の数の引数を一度に 1 つずつ受け入れ、それらを加算できる関数を作成します。

function curryAddition(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function(...nextArgs) {
        return curried(...args, ...nextArgs);
      };
    }
  };
}

// This function sums an array of numbers
function add(...nums) {
  return nums.reduce((acc, num) => acc + num, 0);
}

// Creating a curried version of the addition function
const curriedAdd = curryAddition(add);

// Function to handle n arguments
function curriedAddN(...initialArgs) {
  function adder(...args) {
    if (args.length === 0) {
      return curriedAdd(...initialArgs);
    }
    initialArgs.push(...args);
    return adder;
  }
  return adder;
}

// Examples
const addFiveNumbers = curriedAddN();
console.log(addFiveNumbers(1)(2)(3)(4)(5)()); // 15

const addThreeNumbers = curriedAddN(1)(2)(3);
console.log(addThreeNumbers()); // 6

const addNumbersInSteps = curriedAddN(1, 2)(3)(4, 5);
console.log(addNumbersInSteps()); // 15

結論

カリー化は、コードのモジュール性と再利用性を高める関数型プログラミングの強力な手法です。カリー化により関数を単一引数関数のチェーンに変換することで、部分的な適用と柔軟な関数の合成が可能になります。構成、文字列の書式設定、または複雑な計算のいずれの場合でも、カリー化によりコードの表現力と適応性が高まります。

以上がJavaScriptのカリー化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。