函数柯里化

Posted 纸 飞机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数柯里化相关的知识,希望对你有一定的参考价值。

柯里化(Currying)是一种函数转化方法,是 高阶函数(接收函数作为参数的函数)的一 种,它将一个接收多参数的函数转化为接 收部分参数的函数。柯里化后的函数只传 递部分参数来调用,并返回一个新的函数 去处理剩余的参数,是逐步传参的过程。

注:数学和理论计算机中的柯里化函数一次只能传递 一个参数,js实际应用中则可以传递一个或多个参数。

//普通函数
function add(a, b, c) {
    return a + b + c;
}
add(1,2,3) //6

//手动柯里化后的函数,其参数可以逐步单个传入,得到相同结果。
function _add(a) {
    return function(b) {
        return function(c) {
            return a + b + c;
        }
    }
}

_add(1)(2)(3);//6
//简单封装一个通用柯里化转化函数curry,将普通函数转化为柯里化的函数。
原理:用数组将参数收集起来,达到原函数形参个数就执行原函数,否则返回一个新函数继续接收新参数。
function curry(fn, args) {
    //fn.length:形参个数,num为固定值
    var num = fn.length;
    var args = args || [];
    return function() {
        //arr用于收集传入的参数
        var arr =[].slice.call(argumerits);
        //将之前收集的参数加入arr
        [].push.apply(arr, args);
        //若参数小于num,递归调用继续收集参数
        if (arr.length < num) {
            return curry.call(this, fn, arr);
        }
        //参数达到num,则执行fn
        return fn.apply(this, arr);
    }
}
//此转化后的函数每次可以传入任意个参数
var add_curried = curry(add)
add_curried(1)(2)(3) //6
add_curried(1,2)(3) //6
add_curried(1)(2,3) //6
add_curried(1,2,3) //6
// 使用 lodash 库的—.curry
$ npm i lodash --save
const _= require('lodash')
var abc = function(a,b,c) {
    return [a, b, c];
};
var curried = _.curry(abc);
curried(1)(2)(3);
//=> [1, 2,3] 

柯里化作用

1.延时计算,又叫惰性求值。柯里化后的 函数是分步执行的,前几次调用均返回一 个函数,累积传入的参数,最后调用才会 计算,起到延时计算的作用。如bind函 数,改变this指向但并不执行,只返回函

2.固定易变因素。提前将易变因素传参 定下来,生成一个更明确的应用函数。

3.参数复用。当多次调用同一个函数,并 且传递的参数绝大多数是相同的时候。

4.动态创建函数。先完成部分传参, 创建新的函数返回,在需要的时候传入其余的参数调用执行。

以上是关于函数柯里化的主要内容,如果未能解决你的问题,请参考以下文章

手写柯里化,实现柯里化

js高阶函数应用—函数柯里化和反柯里化

柯里化函数快速排序外边距重叠

函数式编程:纯函数&柯里化&组合函数

函数柯里化

JS中的柯里化及精巧的自动柯里化实现