资讯专栏INFORMATION COLUMN

函数式编程-柯里化(currying)

wangzy2019 / 2262人阅读

摘要:柯里化的好处通过简单地传递几个参数,就能动态创建实用的新函数而且还能带来一个额外好处,那就是保留了函数定义,尽管参数不止一个如何实现柯里化

何为柯里化

概念:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的

参数且返回结果是新函数的技术。

上栗子
var add = function(x) {
    return function(y) {
        return x + y;
    }
}

var increment = add(1);
var addTen = add(10);

increment(2);
// 3

addTen(2);
// 12

解释:我们定义了一个add函数,这个函数接受一个参数并返回一个新的函数。调用add之后,返回的函数通过闭包可以访问到add的第一个参数。这样可以使这类函数的定义和调用更加容易。

进阶(for our enjoyment)
var curry = require("lodash").curry;
var match = curry(function(what, str) {
    return str.match(what);
})

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

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

match(/s+/g, "hello world");
// [" "]

match(/s+/g)("hello world");
//[" "]

var hasSpaces = match(/s+/g);
// function(x) { return x.match(/s+/g) }

hasSpaces("hello world");
//[" "]

hasSpaces("sssss");
// null

var noVowels = replace(/[aeiou]/ig);
// function(replacement, x) { return x.replace(/[aeiou]/ig, replacement) }

var censored = noVowels("*");
// function(x) { return x.replace(/[aeiou]/ig, "*") }

censored("Chocolate Rain");
// "Ch*c*l*t* R**n"

filter(hasSpaces, ["tori_spelling", "tori amos"]);
// ["tori amos"]

var findSpaces = filter(hasSpaces);
// function(xs) { return xs.filter(function(x) { return x.match(/s+/g) }) }

findSpaces(["tori_spelling", "tori amos"]);
// ["tori amos"]

这里表明的是一种“预加载”函数的能力,通过传递一到两个参数调用函数,就能得到一个记住了这些参数的新函数。

当我们谈论纯函数的时候,我们常说函数接受一个输入返回一个输出。currying函数所做的正是这样:每传递一个参数调用函数,就返回一个新函数处理剩余的参数。

柯里化的好处

通过简单地传递几个参数,就能动态创建实用的新函数;而且还能带来一个额外好处,那就是保留了函数定义,尽管参数不止一个

如何实现柯里化
var add = function(){
    var sum = 0;
    for(var i = 0, l = arguments.length; i < l; i++){
        sum += arguments[i];
    }
    return sum;
}

var curry = (function(fn){
    var args = [];
    return function(){
        if(arguments.length == 0) {
            return fn.apply(this, args)
        } else {
            [].push.apply(args, arguments);
            return arguments.callee;
        }
    }
})

currySum = curry(add);

currySum(1, 2, 3);
currySum(1);
currySum(1);
currySum(1);
currySum(1);
currySum();
// 10

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

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

相关文章

  • 高级函数技巧-函数柯里

    摘要:如果你对函数式编程有一定了解,函数柯里化是不可或缺的,利用函数柯里化,可以在开发中非常优雅的处理复杂逻辑。同样先看简单版本的方法,以方法为例,代码来自高级程序设计加强版实现上面函数,可以换成任何其他函数,经过函数处理,都可以转成柯里化函数。 我们经常说在Javascript语言中,函数是一等公民,它们本质上是十分简单和过程化的。可以利用函数,进行一些简单的数据处理,return 结果,...

    shixinzhang 评论0 收藏0
  • JavaScript 函数编程技巧 - 柯里

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

    edgardeng 评论0 收藏0
  • JS函数编程 - 函数组合与柯里

    摘要:而在函数式编程中方法是独立于数据的,我们可以把上面以函数式的方式在写一遍你肯定会说,你是在逗我。对比两个生成新函数的过程,没有柯里化的相对而言就有一点啰嗦了。 我们都知道单一职责原则,其实面向对象的SOLID中的S(SRP, Single responsibility principle)。在函数式当中每一个函数就是一个单元,同样应该只做一件事。但是现实世界总是复杂的,当把现实世界映射...

    MingjunYang 评论0 收藏0
  • JavaScript之柯里

    摘要:简介柯里化,又称部分求值,是把接收多个参数的函数变成接受一个单一参数最初函数的第一个参数的函数,并且返回接受剩余的参数而且返回结果的新函数的技术。按照作者的说法,所谓柯里化就是使函数理解并处理部分应用。的思想极大地助于提升函数的复用性。 简介 柯里化(Currying),又称部分求值(Partial Evaluation),是把接收多个参数的函数变成接受一个单一参数(最初函数的第一个...

    since1986 评论0 收藏0
  • js 函数编程函数柯里

    摘要:函数柯里化是指参数逐渐求值的过程。所以对于有两个变量的函数,如果固定了,则得到有一个变量的函数通用实现先看一个简单的例子显然不是一个柯里化的实现。从一个通用的函数可接受任意,柯里化成专用的函数。 函数柯里化是指参数逐渐求值的过程。 我觉得它是:降低通用性,提高专用性。 通常,柯里化是这样的过程,如果你固定某些参数,你将得到接受余下参数的一个函数。所以对于有两个变量的函数y^x,如果固定...

    voyagelab 评论0 收藏0

发表评论

0条评论

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