首頁 >web前端 >js教程 >初學者在功能性JavaScript中的咖哩指南

初學者在功能性JavaScript中的咖哩指南

William Shakespeare
William Shakespeare原創
2025-02-19 11:45:11660瀏覽

A Beginner's Guide to Currying in Functional JavaScript

初學者在功能性JavaScript中的咖哩指南

咖哩或部分應用是一種功能性技術之一,它聽起來與熟悉傳統寫作JavaScript方式的人們感到困惑。但是,如果適當地應用,它實際上可以使您的功能性JavaScript更具可讀性。

>

鑰匙要點

  • 咖哩是一種功能編程技術,允許部分應用函數的參數,這意味著您可以通過函數期望的所有參數或一個子集。如果傳遞子集,則返回一個函數,以等待其餘參數。 >
  • 咖哩可以使JavaScript代碼更具可讀性和靈活性。它允許創建一個小型,易於配置的功能的庫,這些功能始終如一,可以迅速使用,並且可以在閱讀代碼時可以理解。
  • > >咖哩時的參數順序很重要。最有可能從一個變體替換為另一種變體的參數應該是傳遞給原始函數的最後一個參數。
  • >一些功能性的JavaScript庫,例如RAMDA,提供了靈活的咖哩功能,可以打破功能所需的參數,並允許您單獨或分組將它們傳遞以創建自定義咖哩變化。如果您打算廣泛使用咖哩,建議使用此類庫。
  • >
  • 更可讀性,更靈活
>吹捧功能性JavaScript的優點之一是較短,更緊密的代碼,可以在最少的線路中及其重複較少。有時,這可能是以犧牲可讀性為代價的。在您熟悉功能編程的工作方式之前,以這種方式編寫的代碼很難讀取和理解。

>

>如果您以前遇到過這個術語,但從來不知道它的含義,那麼您可以將其視為一些異國情調,辛辣的技巧,而您無需打擾。但是咖哩實際上是一個非常簡單的概念,它在處理函數參數時解決了一些熟悉的問題,同時為開發人員打開了一系列靈活的選項。

>

什麼是咖哩?

簡而言之,咖哩是構建允許部分應用函數參數的函數的方式。這意味著您可以通過函數期望並獲得結果的所有參數,或者傳遞這些參數的子集,並獲得等待其餘參數的函數。真的很簡單。

咖哩是圍繞功能概念構建的Haskell和Scala等語言中的元素。 JavaScript具有功能功能,但默認情況下並沒有內置咖哩(至少在當前版本中不在語言中)。但是我們已經知道一些功能的技巧,我們也可以在JavaScript中為我們做咖哩。

>讓您了解它的工作方式,讓我們在JavaScript中創建第一個咖哩功能,使用熟悉的語法來構建我們想要的咖哩功能。例如,讓我們想像一個用名字打招呼的功能。我們都知道如何創建一個以名稱和問候的簡單問候功能,並將其名稱登錄到控制台:

var greet = function(greeting, name) {
  console.log(greeting + ", " + name);
};
greet("Hello", "Heidi"); //"Hello, Heidi"
此功能需要以參數的方式傳遞名稱和問候,才能正常工作。但是,我們可以使用簡單的嵌套咖哩來重寫此功能,以便基本功能只需要問候,並且它返回了另一個功能,該功能以我們要問候的人的名字命名。

我們的第一個咖哩

var greetCurried = function(greeting) {
  return function(name) {
    console.log(greeting + ", " + name);
  };
};
對我們編寫該功能的方式的這種微小調整使我們可以為任何類型的問候創建一個新功能,並將新功能傳遞給我們要問候的人的名稱:>

>我們還可以通過在單獨的括號中傳遞每個參數直接調用原始咖哩函數,一個接一個:
var greetHello = greetCurried("Hello");
greetHello("Heidi"); //"Hello, Heidi"
greetHello("Eddie"); //"Hello, Eddie"

為什麼不在瀏覽器中嘗試一下?
greetCurried("Hi there")("Howard"); //"Hi there, Howard"
咖哩所有東西!

>

>很酷的事情是,現在我們已經學會瞭如何修改傳統功能以使用這種方法來處理論點,我們可以用我們想要的盡可能多的參數來做到這一點:

>我們具有與兩個參數相同的靈活性。無論嵌套走了多遠,我們都可以創建新的自定義功能來打招呼,以盡可能多地選擇適合我們的目的的人:

var greetDeeplyCurried = function(greeting) {
  return function(separator) {
    return function(emphasis) {
      return function(name) {
        console.log(greeting + separator + name + emphasis);
      };
    };
  };
};

更重要的是,我們可以在創建原始咖哩函數的自定義變化時,盡可能多地傳遞參數,創建能夠採用適當數量的其他參數的新功能,每個函數以其自己的括號集分別傳遞:

var greetAwkwardly = greetDeeplyCurried("Hello")("...")("?");
greetAwkwardly("Heidi"); //"Hello...Heidi?"
greetAwkwardly("Eddie"); //"Hello...Eddie?"

我們可以輕鬆地定義下屬變化:>

var sayHello = greetDeeplyCurried("Hello")(", ");
sayHello(".")("Heidi"); //"Hello, Heidi."
sayHello(".")("Eddie"); //"Hello, Eddie."
咖哩傳統功能

>您可以看到這種方法的功能,特別是如果您需要創建許多非常詳細的自定義功能。唯一的問題是語法。當您構建這些咖哩功能時,您需要保持嵌套返回的功能,並使用需要多組括號的新功能調用它們,每個功能都包含其自己的孤立參數。它可能會變得凌亂。
var askHello = sayHello("?");
askHello("Heidi"); //"Hello, Heidi?"
askHello("Eddie"); //"Hello, Eddie?"
為了解決這個問題,一種方法是創建一個快速而骯髒的咖哩功能,該功能將命名為沒有所有嵌套返回的現有函數的名稱。咖哩功能將需要刪除該功能的參數列表,並使用這些功能返回原始功能的咖哩版本:

var greet = function(greeting, name) {
  console.log(greeting + ", " + name);
};
greet("Hello", "Heidi"); //"Hello, Heidi"
為了使用它,我們將其傳遞給了一個函數的名稱,該函數採用了任何數量的參數,以及我們想要預先填充的盡可能多的參數。我們回來的是一個正在等待其餘參數的函數:

>

var greetCurried = function(greeting) {
  return function(name) {
    console.log(greeting + ", " + name);
  };
};
>和以前一樣,我們在從咖哩原始功能中構建衍生功能時要使用的參數數量並不限制:

var greetHello = greetCurried("Hello");
greetHello("Heidi"); //"Hello, Heidi"
greetHello("Eddie"); //"Hello, Eddie"
認真對待咖哩

>我們的小咖哩功能可能無法處理所有邊緣案例,例如缺失或可選參數,但是只要我們嚴格對通過參數的語法保持嚴格,它就可以做一個合理的工作。

> RAMDA等一些功能性JavaScript庫具有更靈活的咖哩功能,可以打破功能所需的參數,並允許您單獨或分組通過它們來創建自定義咖哩變化。如果您想廣泛使用咖哩,這可能是要走的方法。

> 無論您選擇如何在編程中添加咖哩更可讀。函數的每個派生變化都應具有一個名稱,以表明其行為的行為以及其期望的參數。

>參數順序

>咖哩時要牢記的一件事是論點的順序。使用我們描述的方法,您顯然希望您最有可能從一個變體替換為下一個變體,以作為傳遞給原始函數的最後一個參數。

提前思考論證順序將使計劃更容易計劃咖哩,並將其應用於您的工作。考慮到最可能改變的論點的順序,在設計功能時,無論如何都不是一個壞習慣。

結論

咖哩是功能性JavaScript的一種非常有用的技術。它允許您生成一個始終如一,迅速使用的小型,易於配置的功能的庫,並且在閱讀代碼時可以理解。將咖哩添加到您的編碼實踐中將鼓勵在整個代碼中使用部分應用功能,避免大量潛在的重複,並可能幫助您更好地養成命名和處理功能參數的習慣。

>

如果您喜歡的話,這篇文章,您可能還喜歡該系列的其他一些:

>
  • 功能性JavaScript簡介
  • JavaScript中的高階函數
  • >
  • 在功能JavaScript中的遞歸
經常詢問有關在功能JavaScript中咖哩的問題(常見問題解答)

> JavaScript中的咖哩和部分應用之間的主要區別是什麼?但是,它們的實施和使用情況有所不同。咖哩是功能編程中的一個過程,其中具有多個參數的函數被轉換為一個函數序列,每個函數都帶有一個參數。另一方面,部分應用程序是指將許多參數固定到函數的過程,從而產生另一個較小的ARITY函數。咖哩始終產生嵌套的一元(1個動力)功能,而部分應用可以產生任何ARITY的功能。

>

>如何在Javascript中增強代碼可讀性和可維護性? JavaScript中的可讀性和可維護性。通過將復雜的功能分解為更簡單的一單元功能,咖哩使代碼更可讀和易於理解。當每個功能執行一個任務時,它還可以促進清潔劑和更模塊化的代碼。這種模塊化使代碼更易於維護和調試,因為可以將問題隔離到特定功能。

您可以提供JavaScript中咖哩的示例嗎?添加三個數字的函數。如果不咖哩,該函數可能看起來像這樣:

函數add(a,b,c){

>返回a b c; }

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

>在咖哩的情況下,相同的函數將寫為:

函數add(a){

return function(b ){
return> return函數(c ){
返回a b c;
}
}
}
}
console.log(add(add(1)(2 )(3)); //輸出:6

>在JavaScript中使用咖哩的局限性或缺點是什麼?主要缺點之一是,對於那些不熟悉該概念的人來說,它可以使代碼更難理解,尤其是在處理大量參數的功能時。由於創建了額外的封閉,它也可能導致性能開銷。此外,它可以使函數調用更多詳細,因為每個參數必須在一組單獨的括號中傳遞。

咖哩與JavaScript中的高階功能有何關係?與JavaScript中高階功能的概念有關。高階函數是一個或多個函數作為參數,返回函數作為其結果或兩者兼而有之的函數。由於咖哩涉及將函數轉換為一系列函數調用,因此它固有地涉及使用高階函數。
>

>可以在JavaScript?

中與箭頭函數一起使用,是的,可以在JavaScript中與箭頭函數一起使用咖哩。實際上,箭頭函數的語法使它們特別適合咖哩。以下是可以使用箭頭函數編寫上一個添加函數的方式:

const add = a => b => c => a b c; console.log(add(add(1)(2) (3)) ); //輸出:6

>是在流行的JavaScript庫或框架中使用的咖哩?例如,這是Ramda和Lodash等庫中的一個基本概念,它為JavaScript中的功能編程提供了實用功能。它也用於Redux,這是一個流行的狀態管理庫,用於REACT。

>在JavaScript中的功能組成方面如何幫助? ​​在JavaScript中的功能組成時,咖哩非常有幫助。功能組成是組合兩個或多個函數以創建新功能的過程。由於咖哩允許您創建單一功能,因此可以通過確保每個函數完全具有一個輸入和一個輸出來簡化函數組成。

>

>

所有JavaScript函數都可以咖哩嗎?

在理論上,任何JavaScript,任何JavaScript可以使用兩個或多個參數的功能。但是,在實踐中,咖哩功能可能並不總是實用或有益的。例如,咖哩對於需要在不同時間使用不同數量的參數調用的函數可能沒有用。

>咖哩如何影響JavaScript代碼的性能?您的代碼更可讀性和模塊化,也可能對性能產生略有影響。這是因為每次您咖哩功能時,都會創建新的關閉。但是,在大多數情況下,對績效的影響可以忽略不計,並且超過了改進的代碼可讀性和可維護性的好處。

以上是初學者在功能性JavaScript中的咖哩指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn