AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

三言兩語說透柯里化和反柯里化

來源: 責編: 時間:2023-08-05 11:45:39 4774觀看
導讀JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實現(xiàn)原理和應用場景,通過大量的代碼示例幫助讀者深入理解這

ykY28資訊網(wǎng)——每日最新資訊28at.com

JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實現(xiàn)原理和應用場景,通過大量的代碼示例幫助讀者深入理解這兩種技術的用途。ykY28資訊網(wǎng)——每日最新資訊28at.com

JavaScript中的柯里化

概念

柯里化(Currying)是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結果的新函數(shù)的技術。這個技術由數(shù)學家Haskell Curry命名。ykY28資訊網(wǎng)——每日最新資訊28at.com

簡單來說,柯里化可以將使用多個參數(shù)的函數(shù)轉換成一系列使用一個參數(shù)的函數(shù)。例如:ykY28資訊網(wǎng)——每日最新資訊28at.com

function add(a, b) {  return a + b; }// 柯里化后function curriedAdd(a) {  return function(b) {    return a + b;  }}

實現(xiàn)原理

實現(xiàn)柯里化的關鍵是通過閉包保存函數(shù)參數(shù)。以下是柯里化函數(shù)的一般模式:ykY28資訊網(wǎng)——每日最新資訊28at.com

function curry(fn) {  return function curried(...args) {    if (args.length >= fn.length) {      return fn.apply(this, args);    } else {      return function(...args2) {        return curried.apply(this, args.concat(args2));      }    }  }}

curry函數(shù)接受一個fn函數(shù)為參數(shù),返回一個curried函數(shù)。curried函數(shù)檢查接收的參數(shù)個數(shù)args.length是否滿足fn函數(shù)需要的參數(shù)個數(shù)fn.length。如果滿足,則直接調用fn函數(shù);如果不滿足,則繼續(xù)返回curried函數(shù)等待接收剩余參數(shù)。ykY28資訊網(wǎng)——每日最新資訊28at.com

這樣通過閉包保存每次收到的參數(shù),直到參數(shù)的總數(shù)達到fn需要的參數(shù)個數(shù),然后將保存的參數(shù)全部 apply 給 fn執(zhí)行。ykY28資訊網(wǎng)——每日最新資訊28at.com

利用這個模式可以輕松將普通函數(shù)柯里化:ykY28資訊網(wǎng)——每日最新資訊28at.com

// 普通函數(shù)function add(a, b) {  return a + b;} // 柯里化后let curriedAdd = curry(add); curriedAdd(1)(2); // 3

應用場景

參數(shù)復用

柯里化可以讓我們輕松復用參數(shù)。例如:ykY28資訊網(wǎng)——每日最新資訊28at.com

function discounts(price, discount) {  return price * discount;}// 柯里化后const tenPercentDiscount = discounts(0.1); tenPercentDiscount(500); // 50tenPercentDiscount(200); // 20

提前返回函數(shù)副本

有時我們需要提前返回函數(shù)的副本給其他模塊使用,這時可以用柯里化。ykY28資訊網(wǎng)——每日最新資訊28at.com

// 模塊Afunction ajax(type, url, data) {  // 發(fā)送ajax請求}// 柯里化后export const getJSON = curry(ajax)('GET');// 模塊Bimport { getJSON } from './moduleA'; getJSON('/users', {name: 'John'});

延遲執(zhí)行

柯里化函數(shù)在調用時并不會立即執(zhí)行,而是返回一個函數(shù)等待完整的參數(shù)后再執(zhí)行。這讓我們可以更加靈活地控制函數(shù)的執(zhí)行時機。ykY28資訊網(wǎng)——每日最新資訊28at.com

let log = curry(console.log);log('Hello'); // 不會立即執(zhí)行setTimeout(() => {  log('Hello'); // 2秒后執(zhí)行}, 2000);

JavaScript中的反柯里化

概念

反柯里化(Uncurrying)與柯里化相反,它將一個接受單一參數(shù)的函數(shù)轉換成接受多個參數(shù)的函數(shù)。ykY28資訊網(wǎng)——每日最新資訊28at.com

// 柯里化函數(shù)  function curriedAdd(a) {  return function(b) {    return a + b;  }}// 反柯里化后function uncurriedAdd(a, b) {  return a + b; }

實現(xiàn)原理

反柯里化的關鍵是通過遞歸不停調用函數(shù)并傳入?yún)?shù),Until參數(shù)的數(shù)量達到函數(shù)需要的參數(shù)個數(shù)。ykY28資訊網(wǎng)——每日最新資訊28at.com

function uncurry(fn) {  return function(...args) {    let context = this;    return args.reduce((acc, cur) => {      return acc.call(context, cur);     }, fn);  }}

uncurry 接收一個函數(shù) fn,返回一個函數(shù)。這個函數(shù)利用reduce不停調用 fn 并傳入?yún)?shù),Until 把args所有參數(shù)都傳給 fn。ykY28資訊網(wǎng)——每日最新資訊28at.com

利用這個模式可以輕松實現(xiàn)反柯里化:ykY28資訊網(wǎng)——每日最新資訊28at.com

const curriedAdd = a => b => a + b;const uncurriedAdd = uncurry(curriedAdd);uncurriedAdd(1, 2); // 3

應用場景

統(tǒng)一接口規(guī)范

有時我們會從其他模塊接收到一個柯里化的函數(shù),但我們的接口需要一個普通的多參數(shù)函數(shù)。這時可以通過反柯里化來實現(xiàn)統(tǒng)一。ykY28資訊網(wǎng)——每日最新資訊28at.com

// 模塊A導出export const curriedGetUser = id => callback => {  // 調用callback(user)};// 模塊B中import { curriedGetUser } from './moduleA';// 反柯里化以符合接口const getUser = uncurry(curriedGetUser); getUser(123, user => {  // use user});

提高參數(shù)靈活性

反柯里化可以讓我們以任意順序 passes 入?yún)?shù),增加了函數(shù)的靈活性。ykY28資訊網(wǎng)——每日最新資訊28at.com

const uncurriedLog = uncurry(console.log);uncurriedLog('a', 'b'); uncurriedLog('b', 'a'); // 參數(shù)順序靈活

支持默認參數(shù)

柯里化函數(shù)不容易實現(xiàn)默認參數(shù),而反柯里化后可以方便地設置默認參數(shù)。ykY28資訊網(wǎng)——每日最新資訊28at.com

function uncurriedRequest(url, method='GET', payload) {  // 請求邏輯}

大廠面試題解析

實現(xiàn)add(1)(2)(3)輸出6的函數(shù)

這是一道典型的柯里化面試題。解析:ykY28資訊網(wǎng)——每日最新資訊28at.com

function curry(fn) {  return function curried(a) {    return function(b) {      return fn(a, b);    }  }}function add(a, b) {  return a + b;}const curriedAdd = curry(add);curriedAdd(1)(2)(3); // 6

利用柯里化技術,我們可以將普通的 add 函數(shù)轉化為 curriedAdd,它每次只接收一個參數(shù),并返回函數(shù)等待下一個參數(shù),從而實現(xiàn)了 add(1)(2)(3) 的效果。ykY28資訊網(wǎng)——每日最新資訊28at.com

實現(xiàn)單參數(shù)compose函數(shù)

compose函數(shù)可以將多個函數(shù)合并成一個函數(shù),這也是一道常見的柯里化面試題。解析:ykY28資訊網(wǎng)——每日最新資訊28at.com

function compose(fn1) {  return function(fn2) {     return function(x) {      return fn1(fn2(x));    };  };}function double(x) {  return x * 2;}function square(x) {  return x * x;}const func = compose(double)(square);func(5); // 50

利用柯里化,我們創(chuàng)建了一個單參數(shù)的 compose 函數(shù),它每次返回一個函數(shù)等待下一個函數(shù)參數(shù)。這樣最終實現(xiàn)了 compose(double)(square) 的效果。ykY28資訊網(wǎng)——每日最新資訊28at.com

反柯里化Function.bind

Function.bind 函數(shù)實現(xiàn)了部分參數(shù)綁定,這本質上是一個反柯里化的過程。解析:ykY28資訊網(wǎng)——每日最新資訊28at.com

Function.prototype.uncurriedBind = function(context) {  const fn = this;  return function(...args) {    return fn.call(context, ...args);  } }function greet(greeting, name) {  console.log(greeting, name);}const greetHello = greet.uncurriedBind('Hello');greetHello('John'); // Hello John

uncurriedBind 通過遞歸調用并傳參實現(xiàn)了反柯里化,使 bind 參數(shù)從兩步變成一步傳入,這也是 Function.bind 的工作原理。ykY28資訊網(wǎng)——每日最新資訊28at.com

總結

柯里化和反柯里化都是非常有用的編程技巧,讓我們可以寫出更加靈活通用的函數(shù)。理解這兩種技術的實現(xiàn)原理可以幫助我們更好地運用它們。在編碼中,我們可以根據(jù)需要決定是將普通函數(shù)柯里化,還是將柯里化函數(shù)反柯里化。合理運用這兩種技術可以大大提高我們的編程效率。ykY28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-125-0.html三言兩語說透柯里化和反柯里化

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何通過Python線程池實現(xiàn)異步編程?

下一篇: 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發(fā)布,近日該機的真機包裝盒在網(wǎng)上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續(xù)了之前的方案,變化不大,這也是目前小米旗艦
  • 6月iOS設備好評榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 印度登月最關鍵一步!月船三號今晚進入環(huán)月軌道

    8月5日消息,據(jù)印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環(huán)月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 十個可以手動編寫的 JavaScript 數(shù)組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結?,F(xiàn)在開始吧。1.forEach()forEach()用于遍歷數(shù)組接收一參
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協(xié)調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實現(xiàn)原理和應用
  • 深度探索 Elasticsearch 8.X:function_score 參數(shù)解讀與實戰(zhàn)案例分析

    在 Elasticsearch 中,function_score 可以讓我們在查詢的同時對搜索結果進行自定義評分。function_score 提供了一系列的參數(shù)和函數(shù)讓我們可以根據(jù)需求靈活地進行設置。近期
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發(fā)布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
Top