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

JavaScript 柯里化

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

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]刪除
最新教學 更多>
  • 網站 HTML 程式碼
    網站 HTML 程式碼
    我一直在嘗試建立一個與航空公司相關的網站。我只是想確認我是否可以使用人工智慧生成程式碼來產生整個網站。 HTML 網站是否相容於博客,或者我應該使用 JavaScript?這是我用作演示的程式碼。 <!DOCTYPE html> <html lang="en">[](url...
    程式設計 發佈於2024-11-05
  • 像程式設計師一樣思考:學習 Java 基礎知識
    像程式設計師一樣思考:學習 Java 基礎知識
    本文介紹了 Java 程式設計的基本概念和結構。它首先介紹了變數和資料類型,然後討論了操作符和表達式,以及控制流程。其次,它解釋了方法和類,然後介紹了輸入和輸出操作。最後,本文透過一個工資計算器的實際範例展示了這些概念的應用。 像程式設計師一樣思考:掌握Java 基礎1. 變數與資料型別 ]Java...
    程式設計 發佈於2024-11-05
  • PHP GD 可以比較兩個影像的相似性嗎?
    PHP GD 可以比較兩個影像的相似性嗎?
    PHP GD 可以確定兩個影像的相似度嗎? 正在考慮的問題詢問是否可以使用以下命令確定兩個圖像是否相同PHP GD 通過比較它們的差異。這需要獲取兩個影像之間的差異並確定它是否完全由白色(或任何統一的顏色)組成。 根據所提供的答案,雜湊函數(如其他回應所建議的)不適用於此情境。比較必須涉及圖像內容而...
    程式設計 發佈於2024-11-05
  • 使用這些鍵編寫進階測試(JavaScript 中的測試需求)
    使用這些鍵編寫進階測試(JavaScript 中的測試需求)
    在本文中,您將學習每個高級開發人員都應該了解的 12 個測試最佳實踐。您將看到 Kent Beck 的文章“Test Desiderata”的真實 JavaScript 範例,因為他的文章是用 Ruby 編寫的。 這些屬性旨在幫助您編寫更好的測試。了解它們還可以幫助您在下一次工作面試中取得好成績。...
    程式設計 發佈於2024-11-05
  • 透過將 matlab/octave 演算法移植到 C 來實現 AEC 的最佳解決方案
    透過將 matlab/octave 演算法移植到 C 來實現 AEC 的最佳解決方案
    完畢!對自己有點印象。 我們的產品需要迴聲消除功能,確定了三種可能的技術方案, 1)利用MCU偵測audio out和audio in的音訊訊號,編寫演算法計算兩側聲音訊號的強度,根據audio out和audio in的強弱在兩個通道之間進行可選的切換,實現半雙工通話效果,但現在市面上都是全雙工...
    程式設計 發佈於2024-11-05
  • 逐步建立網頁:探索 HTML 中的結構和元素
    逐步建立網頁:探索 HTML 中的結構和元素
    ?今天標誌著我軟體開發之旅的關鍵一步! ?我編寫了第一行程式碼,深入研究了 HTML 的本質。涵蓋的元素和標籤。昨天,我探索了建立網站的拳擊技術,今天我透過創建頁眉、頁腳和內容區域等部分將其付諸實踐。我還添加了各種 HTML 元素,包括圖像元素和連結元素,甚至嘗試在單頁網站上進行內部連結。看到這些部...
    程式設計 發佈於2024-11-05
  • 專案創意不一定是獨特的:原因如下
    專案創意不一定是獨特的:原因如下
    在創新領域,存在一個常見的誤解,即專案創意需要具有開創性或完全獨特才有價值。然而,事實並非如此。我們今天使用的許多成功產品與其競爭對手共享一組核心功能。讓他們與眾不同的不一定是想法,而是他們如何執行它、適應用戶需求以及在關鍵領域進行創新。 通訊應用案例:相似但不同 讓我們考慮一下 ...
    程式設計 發佈於2024-11-05
  • HackTheBox - Writeup 社論 [已退休]
    HackTheBox - Writeup 社論 [已退休]
    Neste writeup iremos explorar uma máquina easy linux chamada Editorial. Esta máquina explora as seguintes vulnerabilidades e técnicas de exploração: S...
    程式設計 發佈於2024-11-05
  • 強大的 JavaScript 技術可提升您的編碼技能
    強大的 JavaScript 技術可提升您的編碼技能
    JavaScript is constantly evolving, and mastering the language is key to writing cleaner and more efficient code. ?✨ Whether you’re just getting starte...
    程式設計 發佈於2024-11-05
  • 如何在 ReactJS 中建立可重複使用的 Button 元件
    如何在 ReactJS 中建立可重複使用的 Button 元件
    按鈕無疑是任何 React 應用程式中重要的 UI 元件,按鈕可能用於提交表單或開啟新頁面等場景。您可以在 React.js 中建立可重複使用的按鈕元件,您可以在應用程式的不同部分中使用它們。因此,維護您的應用程式將變得更加簡單,並且您的程式碼將保持 DRY(不要重複自己)。 您必須先在元件資料夾...
    程式設計 發佈於2024-11-05
  • 如何在 Apache HttpClient 4 中實作搶佔式基本驗證?
    如何在 Apache HttpClient 4 中實作搶佔式基本驗證?
    使用Apache HttpClient 4 簡化搶佔式基本驗證雖然Apache HttpClient 4 已經取代了早期版本中的搶佔式驗證方法,但它提供了替代方法以實現相同的功能。對於尋求直接搶佔式基本驗證方法的開發人員,本文探討了一種簡化方法。 為了避免向每個請求手動新增 BasicHttpCon...
    程式設計 發佈於2024-11-05
  • 例外處理
    例外處理
    異常是運行時發生的錯誤。 Java 中的異常處理子系統可讓您以結構化和受控的方式處理錯誤。 Java為異常處理提供了易於使用且靈活的支援。 主要優點是錯誤處理程式碼的自動化,以前必須手動完成。 在舊語言中,需要手動檢查方法傳回的錯誤碼,既繁瑣又容易出錯。 異常處理透過在發生錯誤時自動執行...
    程式設計 發佈於2024-11-05
  • 如何在不使用「dangerouslySetInnerHTML」的情況下安全地在 React 中渲染原始 HTML?
    如何在不使用「dangerouslySetInnerHTML」的情況下安全地在 React 中渲染原始 HTML?
    使用更安全的方法在React 中渲染原始HTML在React 中,您現在可以使用更安全的方法來渲染原始HTML ,避免使用危險的SetInnerHTML 。這裡有四個選項:1。 Unicode 編碼使用Unicode 字元表示UTF-8 編碼檔案中的HTML 實體:<div>{`Firs...
    程式設計 發佈於2024-11-05
  • PHP 死了嗎?不,它正在蓬勃發展
    PHP 死了嗎?不,它正在蓬勃發展
    PHP 是一種不斷受到批評但仍在蓬勃發展的程式語言。 使用率:根據 W3Techs 的數據,截至 2024 年 8 月,全球 75.9% 的網站仍在使用 PHP,其中 43% 的網站基於 WordPress。使用PHP作為開發語言的主流網站中,超過70%包括Facebook、微軟、維基百科、Moz...
    程式設計 發佈於2024-11-05
  • PgQueuer:將 PostgreSQL 轉變為強大的作業佇列
    PgQueuer:將 PostgreSQL 轉變為強大的作業佇列
    PgQueuer 簡介:使用 PostgreSQL 實現高效能作業佇列 社區開發者您好! 我很高興分享一個項目,我相信該項目可以顯著簡化開發人員在使用 PostgreSQL 資料庫時處理作業佇列的方式。 PgQueuer,這是一個 Python 函式庫,旨在利用 PostgreS...
    程式設計 發佈於2024-11-05

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

Copyright© 2022 湘ICP备2022001581号-3