「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScriptのカリー化

JavaScriptのカリー化

2024 年 8 月 7 日に公開
ブラウズ:333

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('')('');
console.log(htmlFormatter('Hello')); // Hello

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

結論

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

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rahulvijayvergiya/javascript-currying-op2?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3