美文网首页饥人谷技术博客
一段柯里化函数代码阅读

一段柯里化函数代码阅读

作者: 忽如寄 | 来源:发表于2018-05-14 23:56 被阅读7次

柯里化的概念大家应该都清楚,就是将一个接受多个参数的函数转化为接受单一参数的函数的技术。

源代码位于 https://github.com/llh911001/mostly-adequate-guide-chinese/blob/master/code/part1_exercises/support.js

柯里化函数:

function inspect(x) {
    return (typeof x === 'function') ? inspectFn(x) :inspectArgs(x);
}

function inspectFn(f) {
    return (f.name) ? f.name : f.toString();
}

function inspectArgs(args) {
    Array.prototype.slice.call(arguments, 0);
    return [].slice.call(args, 0).reduce(function(acc, x){
        return acc += inspect(x);
    }, '(') + ')';
}

function curry(fx) {
    // 函数的length属性返回函数必须传入的参数个数
    var arity = fx.length;

    return function f1() {
        var args = Array.prototype.slice.call(arguments, 0);
        // 参数个数满足的处理
        if (args.length >= arity) {
            return fx.apply(null, args);
        }
        else {
        // 参数个数不满足的处理
            var f2 = function f2() {
                var args2 = Array.prototype.slice.call(arguments, 0);
                return f1.apply(null, args.concat(args2));
            }
            f2.toString = function() {
                return inspectFn(fx) + inspectArgs(args);
            }
            return f2;
        }
    };
}

其中 f2.toString 的实现是会报错的,我已经向作者提交了PR,这段无关紧要,可以跳过不看这个 fs.toString 的实现。很显然实现curry函数的核心就是判断参数个数,然后各种使用apply函数。

接下来就可以体验curry的好处:

add = curry(function(x, y) {
    return x + y;
});

const add5 = add(5);

ad5(4)
// 9

这只是一个非常小的例子,源代码还有很多例子:

add = curry(function(x, y) {
    return x + y;
});

match = curry(function(what, x) {
    return x.match(what);
});

replace = curry(function(what, replacement, x) {
    return x.replace(what, replacement);
});

filter = curry(function(f, xs) {
    return xs.filter(f);
});

map = curry(function map(f, xs) {
    return xs.map(f);
});

reduce = curry(function(f, a, xs) {
    return xs.reduce(f, a);
});

split = curry(function(what, x) {
    return x.split(what);
});

join = curry(function(what, x) {
    return x.join(what);
});

在这里我们可以看到,所有的数据参数都作为了最后一个参数,很明显这样在使用时的好处就在于,这可以成为一种预加载函数函数。

非常明显的在于这样柯里化处理函数,可以让这些函数成为底层部署的函数。

相关文章

  • 一段柯里化函数代码阅读

    柯里化的概念大家应该都清楚,就是将一个接受多个参数的函数转化为接受单一参数的函数的技术。 源代码位于 https:...

  • 基于JavaScript函数闭包实现偏函数以及柯里化

    1.偏函数对函数进行偏函数操作的函数 测试代码 运行结果 2.柯里化演示对含有三个参数的函数进行柯里化 测试代码 ...

  • Swift | 柯里化实现一个函数指定加数

    柯里化简介 柯里化指的是从一个多参数函数变成一连串单参数函数的变换 函数演示 代码实现 补充 这种方式是柯里化的一...

  • 关于Function.prototype.call.apply的

    我在阅读《JavaScript设计模式与开发实践》一书时发现一段有趣的代码,他是函数反柯里化uncurry的一种实...

  • 手写简单.bind()实现

    手写一个实现柯里化的.bind() 柯里化:《函数柯里化小结》柯里化:前端开发者进阶之函数柯里化Currying ...

  • 理解柯里化

    JavaScript函数柯里化,我们直接来看一段普通的代码: 上面这个函数很简答, 就是对传入的a、b、c参数进行...

  • [译]JavaScript中的函数柯里化

    原文 Currying in JS 函数柯里化 函数柯里化以Haskell Brooks Curry命名,柯里化是...

  • 函数柯里化的应用

    函数柯里化,就是将一个接受多个参数的函数转化为接受单一参数的函数的技术。 以上代码中,add3 就是经过柯里化之后...

  • 神奇的toString ()

    学习函数柯里化的时候看到这样一段代码: 这里很是疑惑,我们知道,正常情况下,定义一个函数,然后打印它是输出函数体本...

  • 函数操作v1.0.0

    目录 函柯里化函数节流函数防抖 正文 函柯里化 函数节流 函数防抖

网友评论

    本文标题:一段柯里化函数代码阅读

    本文链接:https://www.haomeiwen.com/subject/cbvsdftx.html