函数柯里化Currying|函数式编程

参数:需要柯里化的函数 返回值:柯里化后的函数 使用:functioncompareSize(a){letb=2returna>b}console.log(compareSize(1));//falseconsole.log(compareSize(2));//falseconsole.log(compareSize(3));//true0柯里化总结柯里化对于函数式JavaScript是一种极其有用的技术。它允许你生成一个简洁、...
函数柯里化Currying|函数式编程
前言一个简单的纯函数:
//比较两个数大小的纯函数functioncompareSize(a,b){returna>b}console.log(compareSize(1,2));//falseconsole.log(compareSize(2,2));//falseconsole.log(compareSize(3,2));//true在上面的纯函数中,我们对两个数值进行了比较,参数b在三次函数的调用中,都是一样的数值2。
既然这样,那我们改写一下吧。
functioncompareSize(a){letb=2returna>b}console.log(compareSize(1));//falseconsole.log(compareSize(2));//falseconsole.log(compareSize(3));//true改写后的代码,参数变成了一个a,虽然结果和上次一样,函数compareSize也还是一个纯函数。
但是内部出现了一个固定的参数b,这样其实变成了hardcode(硬编码)的写法?。是一种固化的代码,代码在内部写死了,修改起来会很麻烦。
让我们再换一种方式试一下:
functioncompareSize(b){returnfunction(a){returna>b}}consthasThanTarget=compareSize(2)console.log(hasThanTarget(1));//falseconsole.log(hasThanTarget(2));//falseconsole.log(hasThanTarget(3));//true最后这种方式其实就是一种函数柯里化的处理方式,所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。
函数柯里化的定义在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是MosesSch?nfinkel和戈特洛布·弗雷格发明的?。

函数柯里化的作用参数复用通过柯里化方法,缓存参数到闭包内部参数,然后在函数内部将缓存的参数与传入的参数组合后给函数执行,来实现参数的复用,降低通用性,提高适用性.
?例子:对正则校验的方法,进行Currying.
functioncurryingCheck(reg){returnfunction(txt){returnreg.test(txt);};}//ES6letcurryingCheck=reg=>(txt=>reg.test(txt))使用:
//正则:只能输入数字lethasNumber=curryingCheck(/^\d+$/);console.log(hasNumber("test"));//falseconsole.log(hasNumber(1));//true//正则:手机号校验lethasPhone=curryingCheck(/^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/);console.log(hasPhone("test"));//falseconsole.log(hasPhone(18577331234));//true延迟运行如果调用柯里化函数传入参数是不调用的,会将参数添加到数组中存储,等到没有参数传入的时候进行调用.
?例子:求和运算,进行Currying.
functionadd(){varargs=Array.prototype.slice.call(arguments);var_that=this;returnfunction(){varnewArgs=Array.prototype.slice.call(arguments);vartotal=args.concat(newArgs);if(!arguments.length){varresult=1;for(vari=0;i<total.length;i++){result*=total[i];}returnresult;}else{returnadd.apply(_that,total);}}}使用:
add(1)(2)(3)();//6add(1,2,3)();//6函数柯里化原理及模拟实现原理利用闭包原理在执行可以形成一个不销毁的作用域,然后把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个最少参数函数。
模拟实现上面的例子中的柯里化函数不够通用,下面来模拟实现一个(来源)
functioncurry(fn,args){varlength=fn.length;args=args||[];
returnfunction(){var_args=args.slice(0),arg,i;
for(i=0;i<arguments.length;i++){arg=arguments[i];_args.push(arg);}if(_args.length<length){returncurry.call(this,fn,_args);}else{returnfn.apply(this,_args);}};}
使用:```jsvarfn=curry(function(a,b,c){console.log([a,b,c]);});fn("a","b","c");//["a","b","c"]fn("a","b")("c");//["a","b","c"]fn("a")("b")("c");//["a","b","c"]fn("a")("b","c");//["a","b","c"]lodash中使用柯里化函数?推荐工作中使用_.curry(func)
功能:创建一个函数,该函数接受一个或多个func的参数,如果func所需要的参数都被提供,则执行func并返回执行的结果,否则继续返回该函数并等待接受剩余的参数.
参数:需要柯里化的函数
返回值:柯里化后的函数
使用:
functioncompareSize(a){letb=2returna>b}console.log(compareSize(1));//falseconsole.log(compareSize(2));//falseconsole.log(compareSize(3));//true0柯里化总结柯里化对于函数式JavaScript是一种极其有用的技术。
它允许你生成一个简洁、易配置、表现统一的库,而且使用起来上手快、具有可读性。
在你的编码实践中加入柯里化会激励你在全部代码中的部分函数上应用它,这样避免了很多潜在的重复工作,并可以帮助你养成关于函数命名和处理函数参数的好习惯。
参考什么是函数柯里化
函数式编程入门教程
柯里化-WIKI
哈斯凯尔·加里-百度百科
JavaScript专题之函数柯里化
2019前端面试系列——JS高频手写代码题
函数柯里化
JS中的柯里化
掌握JavaScript函数的柯里化
js基础篇之——JavaScript的柯里化函数详解
2024-09-18
mengvlog 阅读 10 次 更新于 2025-06-20 21:19:38 我来答关注问题0
  • 函数柯里化的定义在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是MosesSch?

  •  翡希信息咨询 一文搞懂Javascript中的函数柯里化(currying)

    JavaScript中的函数柯里化是一种编程技术,它将原本接受多个参数的函数转换为一系列接收单一参数的嵌套函数。以下是关于函数柯里化的详细解释:1. 柯里化的定义: 柯里化将原本接受多个参数的函数转换为一系列接收单一参数的嵌套函数。 其核心理念是将函数调用方式从f转变为f。2. 柯里化的作用: 延迟...

  •  dr...u@163.com 函数 为什么要Currying化,currying化有什么优点

    在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。在直觉上,柯...

  •  文暄生活科普 浅谈函数柯里化

    在计算机科学中,柯里化(Currying)是一种技术,将接受多个参数的函数转换为接受一个单一参数的函数,并返回接受剩余参数且返回结果的新函数。具体而言,柯里化允许开发者固定函数的一部分参数,返回一个接受剩余参数的函数。这个转化流程的参数数量取决于开发者定义,返回的函数接收的数量与原始函数需要的参...

  •  文暄生活科普 SICP——CS61A学习笔记(3)高阶函数、柯里化、回调函数、递归

    柯里化(Currying):柯里化是一种将多个参数的函数转换为一系列单参数函数的技术。它由Haskell Curry提出,常用于函数式编程语言中。通过柯里化,复杂函数可以逐步处理各个输入参数,最终得到结果。这个过程有助于代码的模块化和状态管理,简化了函数的调用流程。回调函数:这类函数作为一个参数被传入另一...

檬味博客在线解答立即免费咨询

编程相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部