首頁 > web前端 > js教程 > JavaScript 柯里化

JavaScript 柯里化

王林
發布: 2024-07-18 02:38:20
原創
744 人瀏覽過

JavaScript Currying

柯里化是函數式程式設計中的一個強大概念,它將具有多個參數的函數轉換為一系列函數,每個函數接受一個參數。這種技術允許更加模組化和可重複使用的程式碼。在 JavaScript 中,柯里化可以透過多種方式實現。本部落格將探討柯里化,提供範例,並討論實現 n 參數柯里化的不同方法。

什麼是柯里化?

柯里化是將採用多個參數的函數轉換為一系列每個採用單一參數的函數的過程。例如,函數 f(a, b, c) 可以轉換為 f(a)(b)(c)。

為什麼要使用柯里化?

  • 部分應用:柯里化允許你修復函數的一些參數並建立一個新函數。
  • 高階函數:它方便了高階函數的使用,這些函數將其他函數作為參數或傳回它們。
  • 程式碼可重複使用性:柯里化函數更具可重複使用性和可組合性。
  • 函數組合:柯里化可以實現更好的函數組合,即透過組合更簡單的函數來建立複雜的函數,從而產生更清晰、更易於維護的程式碼。

簡單柯里化範例

讓我們從一個基本範例開始來了解柯里化的工作原理。

未柯里化函數

這是一個將三個數字相加的簡單函數:

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

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

登入後複製

說明: 此函數 add 接受三個參數 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 個參數的遞歸函數進行柯里化的範例。我們將使用柯里化來建立一個函數,它可以接受任意數量的參數(一次一個),並將它們加在一起。

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板