ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptのカリー化
カリー化は、複数の引数を持つ関数を、それぞれが 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.
になります。カリー化の一般的な使用例は、構成関数です。たとえば、ログ レベルとメッセージ形式を個別に構成するログ ユーティリティを作成していると想像してください。
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');
カリー化を使用して文字列フォーマッタを作成できる実際の例を考えてみましょう。このフォーマッタを使用すると、プレフィックスとサフィックスを個別に設定できます。
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)
カリー化は、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 個の引数を追加する再帰関数を使用してカリー化する以下の例を見てみましょう。カリー化を使用して、任意の数の引数を一度に 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 サイトの他の関連記事を参照してください。