国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當(dāng)前位置:首頁 > 科技  > 軟件

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

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

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

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

JavaScript中的柯里化

概念

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

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

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

實(shí)現(xiàn)原理

實(shí)現(xiàn)柯里化的關(guān)鍵是通過閉包保存函數(shù)參數(shù)。以下是柯里化函數(shù)的一般模式:krm28資訊網(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。如果滿足,則直接調(diào)用fn函數(shù);如果不滿足,則繼續(xù)返回curried函數(shù)等待接收剩余參數(shù)。krm28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

應(yīng)用場景

參數(shù)復(fù)用

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

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

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

有時我們需要提前返回函數(shù)的副本給其他模塊使用,這時可以用柯里化。krm28資訊網(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ù)在調(diào)用時并不會立即執(zhí)行,而是返回一個函數(shù)等待完整的參數(shù)后再執(zhí)行。這讓我們可以更加靈活地控制函數(shù)的執(zhí)行時機(jī)。krm28資訊網(wǎng)——每日最新資訊28at.com

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

JavaScript中的反柯里化

概念

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

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

實(shí)現(xiàn)原理

反柯里化的關(guān)鍵是通過遞歸不停調(diào)用函數(shù)并傳入?yún)?shù),Until參數(shù)的數(shù)量達(dá)到函數(shù)需要的參數(shù)個數(shù)。krm28資訊網(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不停調(diào)用 fn 并傳入?yún)?shù),Until 把a(bǔ)rgs所有參數(shù)都傳給 fn。krm28資訊網(wǎng)——每日最新資訊28at.com

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

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

應(yīng)用場景

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

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

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

提高參數(shù)靈活性

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

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

支持默認(rèn)參數(shù)

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

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

大廠面試題解析

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

這是一道典型的柯里化面試題。解析:krm28資訊網(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

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

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

compose函數(shù)可以將多個函數(shù)合并成一個函數(shù),這也是一道常見的柯里化面試題。解析:krm28資訊網(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ù)。這樣最終實(shí)現(xiàn)了 compose(double)(square) 的效果。krm28資訊網(wǎng)——每日最新資訊28at.com

反柯里化Function.bind

Function.bind 函數(shù)實(shí)現(xiàn)了部分參數(shù)綁定,這本質(zhì)上是一個反柯里化的過程。解析:krm28資訊網(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 通過遞歸調(diào)用并傳參實(shí)現(xiàn)了反柯里化,使 bind 參數(shù)從兩步變成一步傳入,這也是 Function.bind 的工作原理。krm28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

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

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

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

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

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
久久国产精品72免费观看| 极品av少妇一区二区| 午夜一区二区三区在线观看| 综合中文字幕亚洲| 亚洲日本丝袜连裤袜办公室| 国产精品久久久久久久第一福利| 欧美激情一区二区在线| 欧美国产97人人爽人人喊| 国产人妖乱国产精品人妖| 国产女同互慰高潮91漫画| 国产精品嫩草影院av蜜臀| 国产精品白丝在线| 一区二区在线看| 日韩精品久久久久久| 精品一区二区免费看| 国产高清不卡一区二区| av亚洲精华国产精华精华| 欧美在线影院| 国产午夜精品一区二区三区欧美| 亚洲看片一区| 91精品91久久久中77777| 欧美日韩国产高清一区二区| 日韩亚洲国产中文字幕欧美| 久久亚洲欧美国产精品乐播| 国产精品久久综合| 午夜精品在线视频一区| 精品一区二区日韩| 色综合视频在线观看| 一区二区av| 欧美精品99久久久**| 国产午夜精品一区二区三区四区| 中文字幕亚洲一区二区va在线| 午夜精品一区二区三区免费视频 | 欧美成人精品高清在线播放| 国产日产欧美一区| 一区二区在线免费| 国产福利一区二区三区| 欧美日韩99| 欧美图区在线视频| 国产女主播视频一区二区| 五月婷婷综合激情| 成人h精品动漫一区二区三区| 在线欧美日韩| 8v天堂国产在线一区二区| 中文字幕精品—区二区四季| 奇米一区二区三区| 91免费观看视频| 色婷婷综合久久久中文一区二区| 日韩欧美国产午夜精品| 亚洲妇熟xx妇色黄| 成人一道本在线| 国产精品日韩欧美一区| 精品国产精品网麻豆系列| 亚洲国产另类精品专区| 91香蕉视频mp4| 在线观看视频一区二区| 国产精品毛片久久久久久| 毛片一区二区三区| 亚洲视频久久| 日韩一区和二区| 亚洲.国产.中文慕字在线| www.激情成人| 欧美日韩一级片在线观看| 国产精品久久久久影院| 国产精品综合视频| 香蕉久久夜色精品| 国产精品萝li| 99re在线视频这里只有精品| 在线影视一区二区三区| 亚洲欧美日韩国产一区二区三区| 成人做爰69片免费看网站| 久久久99国产精品免费| 综合激情成人伊人| 成人久久视频在线观看| 欧美在线制服丝袜| 亚洲一区二区在线播放相泽| 女生裸体视频一区二区三区| 91麻豆精品国产91久久久久| 天天综合色天天综合色h| 91久久中文| 国产精品色婷婷久久58| 成人激情免费视频| 欧美一区二区三区不卡| 青娱乐精品在线视频| 久久激情婷婷| 一区二区三区美女| 亚洲国产精品久久久久婷婷老年 | 亚洲综合久久av| 亚洲激情成人| 亚洲色图另类专区| 欧美久久久久久| 国产无人区一区二区三区| 顶级嫩模精品视频在线看| 欧美精品1区2区| 国产麻豆午夜三级精品| 在线观看av不卡| 久久99精品国产麻豆婷婷| 色偷偷成人一区二区三区91| 视频一区视频二区中文| 另类av一区二区| 日韩avvvv在线播放| 久久国产日韩| 麻豆成人综合网| 欧美揉bbbbb揉bbbbb| 国产一区二区伦理片| 欧美丰满美乳xxx高潮www| 国产一区二区在线影院| 91精品国模一区二区三区| 成人精品鲁一区一区二区| 欧美xxxxx牲另类人与| 成人h动漫精品一区二区| 久久久久久久久蜜桃| 欧美精品99| 亚洲精品视频免费看| 亚洲在线观看| 久久99精品国产| 日韩三级电影网址| 色综合夜色一区| 国产精品嫩草99a| 国产精品久久九九| 丝袜亚洲另类欧美综合| 欧美精品一级二级三级| 国产精品一区二区在线播放| 久久亚洲综合色一区二区三区 | 久久久精品国产99久久精品芒果 | 在线一区二区三区做爰视频网站| 国产在线不卡一卡二卡三卡四卡| 日韩欧美高清dvd碟片| 你懂的一区二区| 一区二区三区在线播放| 色欧美片视频在线观看在线视频| 国产高清精品网站| 国产日韩精品视频一区| 久久久蜜桃一区二区人| 国内成+人亚洲+欧美+综合在线 | 韩国精品免费视频| 欧美激情在线一区二区三区| 国产精品日韩一区二区| 国产麻豆精品视频| 亚洲欧美综合色| 91久久精品一区二区三区| 成人av综合一区| 亚洲综合另类小说| 日韩网站在线看片你懂的| 最新日韩av| 国产成人一区二区精品非洲| 亚洲国产精品国自产拍av| 葵司免费一区二区三区四区五区| 大尺度一区二区| 视频一区欧美日韩| 久久这里都是精品| 91久久精品一区二区二区| 91天堂素人约啪| 老司机午夜精品| 国产精品国产三级国产aⅴ入口| 老司机精品福利视频| 欧美一区精品| 国内成+人亚洲+欧美+综合在线| 日韩毛片高清在线播放| 6080日韩午夜伦伦午夜伦| 亚洲精品偷拍| 粉嫩av一区二区三区在线播放| 亚洲第一成人在线| 久久美女艺术照精彩视频福利播放| 一本久道久久综合中文字幕| 99久久综合精品| 精品无码三级在线观看视频| 亚洲激情综合网| 中文字幕精品综合| 欧美一激情一区二区三区| 香蕉国产精品偷在线观看不卡| 欧美激情第六页| 美女视频第一区二区三区免费观看网站| 欧美经典一区二区三区| 欧美精品丝袜久久久中文字幕| 亚洲一区区二区| 亚洲精品久久久久久一区二区| 99热这里都是精品| 久久99热狠狠色一区二区| 亚洲国产成人porn| 国产精品不卡视频| 精品国产自在久精品国产| 欧美综合一区二区| 久色成人在线| 国产一区二区你懂的| 伊人久久婷婷| 欧美日本二区| 91女神在线视频| av不卡在线播放| 丰满亚洲少妇av| 国产精品77777竹菊影视小说| 蜜桃av一区二区在线观看| 亚洲精品乱码久久久久久久久| 国产精品视频一二| 久久日一线二线三线suv| 日韩欧美国产综合| 日韩欧美一二三| 久久亚洲私人国产精品va媚药| 精品区一区二区| 欧美videofree性高清杂交|