资讯专栏INFORMATION COLUMN

js 扩展 -- currying 柯里函数

Pocher / 1649人阅读

摘要:里也有柯里化的实现,只是平时没有在意。如果函数柯里化后虽然生搬硬套,不过现实业务也会有类似场景。

柯里化

先解释下什么是 柯里化

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

js 里也有柯里化的实现,只是平时没有在意。先把原文简介贴出来,此文都来自于它,有兴趣的可直接访问:JavaScript 专题之函数柯里化

里面有段方法,关于柯里化函数:

// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896
var curry = fn =>
    (judge = (...args) =>
        args.length === fn.length ? fn(...args) : arg => judge(...args, arg));

设计 es6 的一些特性,或许一下子很难理解,这里稍微写的再繁琐下:

var curry = function(fn) {
    /**
     * judge
     * args: 柯里化函数的参数
     */
    return function judge() {
        var args = [].slice.call(arguments);
        // 柯里化定义的函数参数 == 调用该函数的参数
        if (args.length >= fn.length) {
            return fn(...args);
        } else {
            // 通过 ()() 形式调用 -- 柯里化
            return function() {
                var args2 = [].slice.call(arguments);
                // 拼接成新的参数,递归继续judge
                return judge.apply(null, args.concat(args2));
            };
        }
    };
};
场景举例

参数调用来调用去,都晕了,那到底有什么用呢?

比如:实现不同幅度的相加功能

var sum = function(increment, number) {
    return increment + number;
};
// 虽然都是相同的相加逻辑,可能在函数命名、功能定义上会有不同(当然这里只是硬性举个例子)。
var addOne = sum;
var addTen = sum;

console.log(addOne(1, 5)); //6
console.log(addTen(10, 5)); //15

如果函数柯里化后:

var addOne = curry(sum)(1)(5); //6
var addTen = curry(sum)(10)(5); //15

虽然生搬硬套,不过现实业务也会有类似场景。这里能体会到 curry 带来的好处:

定制化。原有共性的方法,被拆成符合不同场景的业务方法

参数明确。由于 curry 是根据固定参数约定的,所以通过()()形式固化了参数用意(比如第一个是累加数,第二个是被相加数)

再举一个简单的 Promise 实现举个例子:

function MyPromise(fn) {
    // currying
    this.resolveFn = function(callback) {
        return callback;
    }
    this.then = function(callback) {
        fn(this.resolveFn(callback));
    }
}

new MyPromise(function(resolve, reject) {
    setTimeout(function() {
        resolve(true)
    }, 1000)
}).then(function(data) {
    console.log(data);
})
参考
我只是知识点的“加工者”, 更多内容请查阅原文链接  , 同时感谢原作者的付出:

函数式编程入门教程

JavaScript 专题之函数柯里化

柯里化 维基百科

关于我

如果你觉得这篇文章对你有帮助, 请点个或者分享给更多的道友。

也可以扫码关注我的 微信订阅号 - [ 前端雨爸 ], 第一时间收到技术文章 , 工作之余我会持续输出

最后感谢阅读, 你们的支持是我写作的最大动力

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104672.html

相关文章

  • 从一道面试题认识函数柯里

    摘要:函数柯里化在函数式编程中,函数是一等公民。函数柯里化的主要作用和特点就是参数复用提前返回和延迟执行。可能在实际应用场景中,很少使用函数柯里化的解决方案,但是了解认识函数柯里化对自身的提升还是有帮助的。 最近在整理面试资源的时候,发现一道有意思的题目,所以就记录下来。 题目 如何实现 multi(2)(3)(4)=24? 首先来分析下这道题,实现一个 multi 函数并依次传入参数执行,...

    13651657101 评论0 收藏0
  • 翻译连载 | JavaScript 轻量级函数式编程-第3章:管理函数的输入 |《你不知道的JS》姊

    摘要:但是,对函数式编程而言,这个行为的重要性是毋庸置疑的。关于该模式更正式的说法是偏函数严格来讲是一个减少函数参数个数的过程这里的参数个数指的是希望传入的形参的数量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是...

    xiaowugui666 评论0 收藏0
  • 高阶函数应用 —— 柯里化与反柯里

    摘要:柯里化通用式上面的柯里化函数没涉及到高阶函数,也不具备通用性,无法转换形参个数任意或未知的函数,我们接下来封装一个通用的柯里化转换函数,可以将任意函数转换成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 阅读原文 前言 在 JavaScript 中,柯里化和反柯里化是高阶函数的一种应用,在这之前...

    wyk1184 评论0 收藏0
  • JS中的柯里

    摘要:作为函数式编程语言,带来了很多语言上的有趣特性,比如柯里化和反柯里化。个人理解不知道对不对延迟执行柯里化的另一个应用场景是延迟执行。不断的柯里化,累积传入的参数,最后执行。 作为函数式编程语言,JS带来了很多语言上的有趣特性,比如柯里化和反柯里化。 这里可以对照另外一篇介绍 JS 反柯里化 的文章一起看~ 1. 简介 柯里化(Currying),又称部分求值(Partial Evalu...

    Hancock_Xu 评论0 收藏0
  • 【进阶 6-2 期】深入高阶函数应用之柯里

    摘要:引言上一节介绍了高阶函数的定义,并结合实例说明了使用高阶函数和不使用高阶函数的情况。我们期望函数输出,但是实际上调用柯里化函数时,所以调用时就已经执行并输出了,而不是理想中的返回闭包函数,所以后续调用将会报错。引言 上一节介绍了高阶函数的定义,并结合实例说明了使用高阶函数和不使用高阶函数的情况。后面几部分将结合实际应用场景介绍高阶函数的应用,本节先来聊聊函数柯里化,通过介绍其定义、比较常见的...

    stackvoid 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<