什么是函数柯里化 currying?

做题时看到 currying 这个词还挺有意思的,本意是咖喱,翻译为中文叫柯里化,是因为是以逻辑学家 Haskell Curry 命名的。

arity(参数个数)是函数所需的形参的数量。
函数柯里化(Currying)意思是把接受多个 arity 的函数变换成接受单一 arity 的函数。
换句话说,就是重构函数让它接收一个参数,然后返回接收下一个参数的函数,依此类推。

这有点像套娃,就是把含有多个参数的函数,分解为一个一个的函数进行返回。

例一:

function unCurried(x, y) {return x + y;
}function curried(x) {return function(y) {return x + y;}
}
// ES6 写法
const curried = x => y => x + ycurried(1)(2) // 3

例二:

function add(x) {return function(y) {return function(z) {return x + y + z}}
}add(10)(20)(30); // 60

柯里化的作用之一:参数复用(正则匹配案例)

函数柯里化具体怎样使用呢?我搜到了这篇文章函数柯里化 ,现在把其中一个正则表达式的例子抽出来。

使用通用函数(平常写的代码)

    function checkByRegExp(regExp, str) {return regExp.test(str)}// 校验手机号checkByRegExp(/^1\d{10}$/, '15152525634'); checkByRegExp(/^1\d{10}$/, '13456574566'); checkByRegExp(/^1\d{10}$/, '18123787385'); // 校验邮箱checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, 'fsds@163.com'); checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, 'fdsf@qq.com'); checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, 'fjks@qq.com');

它的缺点是:

  1. 校验同一类型的数据时,相同的正则写了很多次
  2. 代码可读性较差,如果没有注释,我们并不能一下就看出来正则的作用

函数柯里化

    // 第一步:定义柯里化函数function curryingCheckByRegExp(regExp) {return function(str) {// console.log(regExp.test(str)) // 6 个 truereturn regExp.test(str)}}// 第二步:将最外层函数保存为变量// 校验手机const checkPhone = curryingCheckByRegExp(/^1\d{10}$/)// 校验邮箱const checkEmail = curryingCheckByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/)// 第三步:调用第二层函数// 校验手机号checkPhone('15152525634');checkPhone('13456574566'); checkPhone('18123787385'); // 校验邮箱checkEmail('fsds@163.com'); checkEmail('fdsf@qq.com'); checkEmail('fjks@qq.com');

柯里化的其他作用,请看这篇文章:前端面试手写代码——函数柯里化

函数柯里化的作用一:参数复用(正则匹配案例)相关推荐

  1. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

    js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...

  2. JavaScript 专题之函数柯里化

    JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...

  3. 函数柯里化的几个例子

    函数柯里化 用于创建一个已经设置好了一个或或者多个参数的函数 通用写法如下: function curry(fn){var args = Array.prototype.slice.call(argu ...

  4. 深入详解python高级特性——函数柯里化(Currying)与反柯里化

    前言:本章的内容本来很简单,但是涉及到的理论部分相对较多,想要彻底弄懂前因后果需要具备以下几个知识点, (1)python的高阶函数 (2)python的装饰器本质 (3)Python的functoo ...

  5. 从一道面试题认识函数柯里化

    最近在整理面试资源的时候,发现一道有意思的题目,所以就记录下来. 题目 如何实现 multi(2)(3)(4)=24? 首先来分析下这道题,实现一个 multi 函数并依次传入参数执行,得到最终的结果 ...

  6. JS - 函数柯里化

    一.概念 柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数. 简单来说,柯里化是一种函数的转换,它是指将一个函数从可调用的 ...

  7. JavaScript 中函数 柯里化风格的运用

    导语 当我第一次看见 柯里化 这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 "高大上"的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后 ...

  8. 函数柯里化的意义_详解JS函数柯里化

    第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法. 果然是不管作用怎么样都要有个高端的名字才 ...

  9. 【JavaScript】函数柯里化

    文章目录 1. 什么是函数柯里化 2. 柯里化常用场景 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3. 经典例题 3.1 封装通用柯里化函数 3.2 创建一个灵活的多步执行的柯里化函数 3 ...

最新文章

  1. LeetCode 21. Merge Two Sorted Lists--合并2个有序列表--python递归,迭代解法
  2. 使用SAX解析XML封装实体Bean
  3. CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
  4. 远程管理卡介绍使用场景
  5. .net数据绑定控件中的数据导出到Excel
  6. lshw linux_Linux lshw命令–获取Linux硬件信息
  7. 如何下载Idea专业版
  8. linux 桌面对比,七大顶级Linux桌面比较
  9. qt 部署 错误_QT for Windows安装配置总结及采坑问题汇总
  10. 《程序员修炼之道》读书笔记(4):注重实效的偏执(防卫策略)
  11. minigui学习笔记五
  12. 反锯齿渲染技术--SMAA
  13. Dubbo配置加载问题
  14. el-table行合并,单列行合并或者指定列合并行
  15. mysql连接三个表
  16. Ubuntu升级软件和ubuntu升级系统的命令
  17. 对捕金猎人的买涨买跌交易感悟?(交易基础篇)
  18. DLL文件是什么?有几种调用方式?
  19. 星起航:我国对外贸易强势发展,武汉自贸区未来或将成为外贸主力
  20. 免费Java游戏源代码素材推荐

热门文章

  1. Excel表格传送至AS400时乱码问题
  2. 原材料批次管理立体仓库库位管理生产领料管理生产线工序管理产成品系列号唯一码管理产品质量追溯管理
  3. 透析:大数据与商业决策究竟是何关系?
  4. 手柄的姿态算法_VR手柄姿态初始算法、VR手柄及存储介质的制作方法
  5. 运维日记010 - Linux下的链接文件
  6. Android的LeakCanary的原理分析
  7. java实现微信公众号内容推送系统
  8. 【原创】 中国剩余定理 和 拓展中国剩余定理
  9. win32项目和win32控制台程序的区别
  10. C#编程简单模拟与下位机的串口通信