当前位置:首页 > 科技  > 软件

三言两语说透柯里化和反柯里化

来源: 责编: 时间:2023-08-05 11:45:39 3379观看
导读JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用场景,通过大量的代码示例帮助读者深入理解这

Ka628资讯网——每日最新资讯28at.com

JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用场景,通过大量的代码示例帮助读者深入理解这两种技术的用途。Ka628资讯网——每日最新资讯28at.com

JavaScript中的柯里化

概念

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由数学家Haskell Curry命名。Ka628资讯网——每日最新资讯28at.com

简单来说,柯里化可以将使用多个参数的函数转换成一系列使用一个参数的函数。例如:Ka628资讯网——每日最新资讯28at.com

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

实现原理

实现柯里化的关键是通过闭包保存函数参数。以下是柯里化函数的一般模式:Ka628资讯网——每日最新资讯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函数接受一个fn函数为参数,返回一个curried函数。curried函数检查接收的参数个数args.length是否满足fn函数需要的参数个数fn.length。如果满足,则直接调用fn函数;如果不满足,则继续返回curried函数等待接收剩余参数。Ka628资讯网——每日最新资讯28at.com

这样通过闭包保存每次收到的参数,直到参数的总数达到fn需要的参数个数,然后将保存的参数全部 apply 给 fn执行。Ka628资讯网——每日最新资讯28at.com

利用这个模式可以轻松将普通函数柯里化:Ka628资讯网——每日最新资讯28at.com

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

应用场景

参数复用

柯里化可以让我们轻松复用参数。例如:Ka628资讯网——每日最新资讯28at.com

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

提前返回函数副本

有时我们需要提前返回函数的副本给其他模块使用,这时可以用柯里化。Ka628资讯网——每日最新资讯28at.com

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

延迟执行

柯里化函数在调用时并不会立即执行,而是返回一个函数等待完整的参数后再执行。这让我们可以更加灵活地控制函数的执行时机。Ka628资讯网——每日最新资讯28at.com

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

JavaScript中的反柯里化

概念

反柯里化(Uncurrying)与柯里化相反,它将一个接受单一参数的函数转换成接受多个参数的函数。Ka628资讯网——每日最新资讯28at.com

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

实现原理

反柯里化的关键是通过递归不停调用函数并传入参数,Until参数的数量达到函数需要的参数个数。Ka628资讯网——每日最新资讯28at.com

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

uncurry 接收一个函数 fn,返回一个函数。这个函数利用reduce不停调用 fn 并传入参数,Until 把args所有参数都传给 fn。Ka628资讯网——每日最新资讯28at.com

利用这个模式可以轻松实现反柯里化:Ka628资讯网——每日最新资讯28at.com

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

应用场景

统一接口规范

有时我们会从其他模块接收到一个柯里化的函数,但我们的接口需要一个普通的多参数函数。这时可以通过反柯里化来实现统一。Ka628资讯网——每日最新资讯28at.com

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

提高参数灵活性

反柯里化可以让我们以任意顺序 passes 入参数,增加了函数的灵活性。Ka628资讯网——每日最新资讯28at.com

const uncurriedLog = uncurry(console.log);uncurriedLog('a', 'b'); uncurriedLog('b', 'a'); // 参数顺序灵活

支持默认参数

柯里化函数不容易实现默认参数,而反柯里化后可以方便地设置默认参数。Ka628资讯网——每日最新资讯28at.com

function uncurriedRequest(url, method='GET', payload) {  // 请求逻辑}

大厂面试题解析

实现add(1)(2)(3)输出6的函数

这是一道典型的柯里化面试题。解析:Ka628资讯网——每日最新资讯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 函数转化为 curriedAdd,它每次只接收一个参数,并返回函数等待下一个参数,从而实现了 add(1)(2)(3) 的效果。Ka628资讯网——每日最新资讯28at.com

实现单参数compose函数

compose函数可以将多个函数合并成一个函数,这也是一道常见的柯里化面试题。解析:Ka628资讯网——每日最新资讯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

利用柯里化,我们创建了一个单参数的 compose 函数,它每次返回一个函数等待下一个函数参数。这样最终实现了 compose(double)(square) 的效果。Ka628资讯网——每日最新资讯28at.com

反柯里化Function.bind

Function.bind 函数实现了部分参数绑定,这本质上是一个反柯里化的过程。解析:Ka628资讯网——每日最新资讯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 通过递归调用并传参实现了反柯里化,使 bind 参数从两步变成一步传入,这也是 Function.bind 的工作原理。Ka628资讯网——每日最新资讯28at.com

总结

柯里化和反柯里化都是非常有用的编程技巧,让我们可以写出更加灵活通用的函数。理解这两种技术的实现原理可以帮助我们更好地运用它们。在编码中,我们可以根据需要决定是将普通函数柯里化,还是将柯里化函数反柯里化。合理运用这两种技术可以大大提高我们的编程效率。Ka628资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-125-0.html三言两语说透柯里化和反柯里化

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何通过Python线程池实现异步编程?

下一篇: 如何使用JavaScript创建一只图像放大镜?

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • Raft算法:保障分布式系统共识的稳健之道

    Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 自律,给不了Keep自由!

    自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 回归OPPO两年,一加赢了销量,输了品牌

    回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    7月20日消息,据外媒报道,研究机构的报告显示,由于需求下滑,今年二季度全球智能手机的出货量,同比下滑了11%,三星、苹果等主要厂商的销量,较去年同期均有下
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
Top
Baidu
map