前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >函数curry化(Haskell Curry)

函数curry化(Haskell Curry)

作者头像
elson
发布于 2020-01-02 08:01:36
发布于 2020-01-02 08:01:36
1.4K00
代码可运行
举报
文章被收录于专栏:Elson's webElson's web
运行总次数:0
代码可运行

什么是函数curry化?

官方解释 柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

个人白话文理解

当一个函数fn有多个参数时,可以先传入一部分参数,生成一个中继函数nextFn,然后在nextFn当中再传入剩下的参数。(一步curry化)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function currying(x, y) {
    if (typeof y == 'undefined') {
        return function (y) {
            return x + y;
        };
    }
    else {
        return x + y;
    }
}

var nextFn = currying(5);
console.log(nextFn(5)); // 10

通用curry化函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function currying(fn) {
    var slice = Array.prototype.slice;
    // 将arguments对象数组化,并排除第一个参数fn
    var args = slice.call(arguments, 1);

    return function () {
        var newArgs = slice.call(arguments);

        return fn.apply(null, args.concat(newArgs));
    };
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// test
function add(a, b, c, d, e) {
    return a + b + c + d + e;
}

// 一步curry化
var next = currying(add, 11, 22);
// 两步curry化
var next2 = currying(next, 33);
// 三步curry化
var next3 = currying(next2, 44);

next(33, 44, 55); // 165
next2(44, 55); // 165
next3(55); // 165

curry化有什么用

参照:http://www.zhangxinxu.com/wordpress/2013/02/js-currying/

1. 参数复用

curry化之后会返回一个新的函数,这个函数通过闭包保存着重复的参数。

2. 延迟执行

其实ES5当中的Function.prototype.bind方法运用的就是curry化的思想

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (typeof Function.prototype.bind == 'undefined') {
    Function.prototype.bind = function (o) {
        var me = this;
        var args = [].slice.call(arguments, 1);

        return function () {
            var newArgs = [].slice.call(arguments);

            return me.apply(o, args.concat(newArgs));
        };
    };
}

总结

看完curry化,第一个感觉是好高大阿,但是…好像目前没感觉到它有什么用耶。。。

其实我觉得张鑫旭的博客JS中的柯里化当中,有段话讲的挺有道理的

最近在看《JavaScript模式》一书,天哪,里面出现的各种设计模式(如工厂模式、外观模式、观察者模式),一双手都数不过来。而且这些名词又很抽象,书一合,马上大眼瞪小眼了。这种感觉就像是,房间里来了10个黑人,每个黑人都有一个“¥%#…¥”的名字,好不容易勉强记住了,灯一关房间一黑,等再开灯的时候,每个黑人的名字都变成…..”hello”了。 其实这些模式在实际使用的时候,或多或少都使用过,当看到“xx模式”概念的时候,我们就会猛然惊起:“哦,原来这个就叫做‘观察者模式’等”。现在要讨论的问题是,我们有没有必要把这些“xx模式”都记住呢,都理解其对应的核心呢? 这个问题类似于,我可以看懂NBA的篮球比赛,那我有没有必要把各个球队以及球队的队员都记住呢? 如果想成为JS大神,从这个目标来看,这是需要的;好比优秀的篮球解说员必须要知道每个球队的名字、球员甚至周边八卦。但是,现实很重要。如果连JS函数相关的基本东西都驾驭不好,显然,硬是啃这些似懂非懂的概念只会造成混乱。如果你觉得可以更近一步,先通透几个自己习惯的熟悉的使用模式,足够应付实际项目;其他一些概念什么的,更多的只是噱头,实用性其实并不大。 正如本文的柯里化,看上去很高级,似乎也有点用处,然而JS的灵活性使得很多实现完全摆脱“柯里化”这个概念的束缚,以更通俗易懂的方式实现。 然而,即使实用性不高,我们还是要有所了解,因为,你不知道什么时候会用到它。比方说CSS中的 display:table; 某些情况下可以解决一些棘手问题(secret!)。 因此,本文的柯里化至少要知道个大概…


代码语言:txt
AI代码解释
复制
                 var gitalk = new Gitalk({                     clientID: '82f3fb6574634b43d203',                     clientSecret: '5790d9fdbfe9340d29810b694b3b2070a9a3b492',                     repo: 'zfengqi.github.io',                     owner: 'zfengqi',                     admin: ['zfengqi'],                     distractionFreeMode: true,                     id: window.location.pathname,                     });                     gitalk.render('gitalk-container');
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一段柯里化函数代码阅读
柯里化的概念大家应该都清楚,就是将一个接受多个参数的函数转化为接受单一参数的函数的技术。
用户1515472
2019/07/25
3710
js原生函数之call和apply,bind
call 和 apply 和 bind 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。
用户1394570
2018/08/08
9450
前端必知道的几个 JavaScript 高级函数
高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们。简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回。
夜尽天明
2023/03/15
4190
前端必知道的几个 JavaScript 高级函数
【JS】530- 一文看懂高阶函数
高阶函数 函数可以作为参数传递 函数可以作为返回值输出 函数作为参数传递 回调函数 在ajax异步请求的过程中,回调函数使用的非常频繁 在不确定请求返回的时间时,将callback回调函数当成参数传入
pingan8787
2020/03/19
7270
【JS】530- 一文看懂高阶函数
JavaScript专题之函数柯里化[通俗易懂]
在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。
全栈程序员站长
2022/07/20
5560
深入理解JavaScript系列(49):Function模式(上篇)
本篇主要是介绍Function方面使用的一些技巧(上篇),利用Function特性可以编写出很多非常有意思的代码,本篇主要包括:回调模式、配置对象、返回函数、分布程序、柯里化(Currying)。
用户4962466
2019/12/16
3740
函数式编程 pipe之函数柯里化
1.pipe 管道: 我们想让一个参数通过第一个函数之后再通过第二个函数 一般写法: const addOne = x => x + 1 const addTwo = x => x + 2 addTwo(addOne(1)) // 4 pipe写法: const pipe = ...args => x => args.reduce( (outputValue, currentFunction) => currentFunction(outputValue), x ) 备注:reduce语法
用户3055976
2020/09/18
6260
柯里化详解
上面的示例是一个正则的校验,正常来说直接调用check函数就可以了,但是如果我有很多地方都要校验是否有数字,其实就是需要将第一个参数reg进行复用,这样别的地方就能够直接调用hasNumber,hasLetter等函数,让参数能够复用,调用起来也更方便。
用户9914333
2022/07/21
2770
柯里化详解
【基于 JS 函数式编程-3】柯里化 | 偏函数 | 组合与管道
定义:接受可变数量参数的函数,称为变参函数。 在es5中我们可以通过arguments来捕获调用变参函数的额外参数。 在es6中,我们可以使用扩展运算符:"..."实现变参函数。如:
前端修罗场
2023/10/07
3640
【基于 JS 函数式编程-3】柯里化 | 偏函数 | 组合与管道
防抖、节流、call、bind、apply、new、柯里化实现
throttle function throttle(fn, threshhold) { var last, timerId; threshhold || (threshhold = 250); return function() { var now = Date.now(); if(last && now - last < threshhold) { clearTimeout(timerId); timerId = setTimeout(
前端迷
2019/09/30
3250
《JavaScript 模式》读书笔记(4)— 函数5
这部分我们主要讨论Curry化和部分函数应用的内容。但是在深入讨论之前,我们需要先了解一下函数应用的含义。
zaking
2020/04/01
5410
JS中的柯里化
柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
前端下午茶
2018/10/22
4.9K0
柯理化函数
函数柯理化的表现是:把一个需要传入多个变量的函数变为多个嵌套函数,并且内层函数会调用上层函数的变量。
娜姐
2021/01/14
5220
理解运用JS的闭包、高阶函数、柯里化
JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性。
书童小二
2018/09/03
1.6K1
理解运用JS的闭包、高阶函数、柯里化
编写高质量代码:改善JavaScript程序建议--函数式编程
使用call和apply方法可以把一个函数转换为方法传递给某个对象。这种行为只是临时的,函数最终并没有作为对象的方法而存在,当函数被调用后,该对象方法会自动被注销。
奋飛
2019/08/15
4110
代码抗击病毒之-大厂面试必考题总结
前端入行三年多了,整天疲于业务,虽说业务能力突出,但却不知自己到底处在一个什么水平,突发奇想,用面试来检验自己,于是,开始了为期一个月的大厂面试尝试之路,总结如下:
用户7413032
2020/06/11
5910
代码抗击病毒之-大厂面试必考题总结
JavaScript高阶函数
把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等 可以保持业务逻辑模块的纯净和高内聚性
薛定喵君
2019/11/06
4770
javascript教程:实现函数柯里化与反柯里化
维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并返回接受剩余的参数而且返回结果的新函数的技术。其由数学家Haskell Brooks Curry提出,并以curry命名。
用户4831957
2019/09/10
7990
滴滴前端一面高频手写面试题汇总_2023-02-28
浅拷贝是指,一个新的对象对原始对象的属性值进行精确地拷贝,如果拷贝的是基本数据类型,拷贝的就是基本数据类型的值,如果是引用数据类型,拷贝的就是内存地址。如果其中一个对象的引用内存地址发生改变,另一个对象也会发生变化。
用户10358576
2023/02/28
7600
彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
这段时间我试着通过思维导图来总结知识点,主要关注的是一些相对重要或理解难度较高的内容。下面是同系列文章:
程序员白彬
2020/08/25
1.6K0
彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
相关推荐
一段柯里化函数代码阅读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验