」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > JavaScript 柯里化

JavaScript 柯里化

發佈於2024-08-07
瀏覽:209

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

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]刪除
最新教學 更多>
  • 如何使用Python的記錄模塊實現自定義處理?
    如何使用Python的記錄模塊實現自定義處理?
    使用Python的Loggging Module 確保正確處理和登錄對於疑慮和維護的穩定性至關重要Python應用程序。儘管手動捕獲和記錄異常是一種可行的方法,但它可能乏味且容易出錯。 解決此問題,Python允許您覆蓋默認的異常處理機制,並將其重定向為登錄模塊。這提供了一種方便而係統的方法來捕獲...
    程式設計 發佈於2025-02-07
  • 如何使用CSS創建彎曲的DIV?
    如何使用CSS創建彎曲的DIV?
    使用CSS 此方法涉及設置border-radius屬性以定義曲線的半徑。對於彎曲的底部邊緣,您可以使用以下語法: 這將創建一個帶有底部邊緣的div。 使用radial gradient:如果您喜歡透明的彎曲形狀,則可以利用徑向級屬性屬性:有關更多變體和其他配置,您可以訪問作者的網站https:...
    程式設計 發佈於2025-02-07
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    在嘗試將image存儲在mysql數據庫中時,您可能會遇到一個可能會遇到問題。本指南將提供成功存儲您的圖像數據的解決方案。 easudy values('$ this-> ; image_id','file_get_contents($ tmp_imag...
    程式設計 發佈於2025-02-07
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式界面中實現垂直滾動元素的CSS高度限制 考慮一個佈局,其中我們具有與可滾動的映射div一起移動的subollable map div用戶的垂直滾動,同時保持其與固定側邊欄的對齊方式。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 可以限制地圖的滾動,我們可以利用CS...
    程式設計 發佈於2025-02-07
  • 如何可靠地檢查MySQL表中的列存在?
    如何可靠地檢查MySQL表中的列存在?
    在mySQL中確定列中的列存在,驗證表中的列存在與與之相比有點困惑其他數據庫系統。常用的方法:如果存在(從信息_schema.columns select * * where table_name ='prefix_topic'和column_name =&...
    程式設計 發佈於2025-02-07
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。可以將fd.append("fileToUpload[]", files[x]);方法用於此目的,允許您在單個請求中發送多個文件。 初始嘗試 在JavaScript中,一種常見方法是:); 但是,此代碼僅處理第...
    程式設計 發佈於2025-02-07
  • 在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在hibernate中保存枚舉值:故障排除錯誤的列type ,他們各自的映射至關重要。在Java中使用枚舉類型時,至關重要的是,建立冬眠的方式如何映射到基礎數據庫。 在您的情況下,您已將MySQL列定義為枚舉,並在Java中創建了相應的枚舉代碼。但是,您遇到以下錯誤:“ MyApp中的錯誤列類型...
    程式設計 發佈於2025-02-07
  • 我可以在CSS中使用SVG作為偽元素嗎?
    我可以在CSS中使用SVG作為偽元素嗎?
    使用svgs用作pseudo-element content css content properts允許在使用元素之前或之後使用元素插入各種類型的內容偽元素,例如::之前和::之後。但是,對可以包括哪些內容有限制。 可以將svgs用作pseudo-element Content? ,現在可以使...
    程式設計 發佈於2025-02-07
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    使用(1)而不是(;;)會導致無限循環的性能差異? 現代編譯器,(1)和(;;)之間沒有性能差異。 是如何實現這些循環的技術分析在編譯器中: perl: S-> 7 8 unstack v-> 4 -e語法ok 在GCC中,兩者都循環到相同的彙編代碼中,如下所示:。 globl t_時 ...
    程式設計 發佈於2025-02-07
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在java中的多個返回類型:一個誤解介紹,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但是,情況確實如此嗎? 通用方法:拆開神秘 [方法僅具有單一的返回類型。相反,它採用機制,如鑽石符號“ ”。 分解方法簽名: :本節定義了一個通用類型參數,E。它表示該方法接受了擴展foo類...
    程式設計 發佈於2025-02-07
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python 導入編解碼器 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有表情符號 emoji_pattern = re.compile(“ [”...
    程式設計 發佈於2025-02-07
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本號的替代方法,它是使用以下語法: https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js(google hosted...
    程式設計 發佈於2025-02-07
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    [2最後一行與數據集中的每個不同標識符關聯。考慮以下數據: 1 2014-02-01 kjkj 1 2014-03-11 ajskj 3 2014-02-01 sfdg 3 2014-06-12 fdsa 在(ID)上選擇DISTINC 來自the_table 按ID訂單,date desc;...
    程式設計 發佈於2025-02-07
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令arr = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-02-07
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mysql組使用mysql組來調整查詢結果。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的基於列的轉換。通過子句以及條件匯總函數,例如總和或情況。讓我們考慮以下查詢: select d.data_timestamp, sum(data_id = 1 tata...
    程式設計 發佈於2025-02-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3