函数柯里化

这个概念知道很久了,但是并没遇到很合适的使用场景,本次写点东西来系统描述一下,方便以后回顾。

定义

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

一个最基础的例子

function add(x,y){
    return x + y
}
//柯里化前计算 1 + 2
add(12)
//假设有一个 curry 方法可以使一个函数柯里化,addCurry = curry(add); 柯里化后计算 1 + 2
addCurry(1)(2)

一个可能使用的场景:(从别人的优秀博客抄来的例子)

function ajax(type, url, data) {
    var xhr = new XMLHttpRequest();
    xhr.open(type, url, true);
    xhr.send(data);
}

// 虽然 ajax 这个函数非常通用,但在重复调用的时候参数冗余
ajax('POST', 'www.test.com', "name=kevin")
ajax('POST', 'www.test2.com', "name=kevin")
ajax('POST', 'www.test3.com', "name=kevin")

// 利用 curry
var ajaxCurry = curry(ajax);

// 以 POST 类型请求数据
var post = ajaxCurry('POST');
post('www.test.com', "name=kevin");

// 以 POST 类型请求来自于 www.test.com 的数据
var postFromTest = post('www.test.com');
postFromTest("name=kevin");

curry 的这种用途可以理解为:参数复用。本质上是降低通用性,提高适用性。
那么要怎么实现 curry 呢?

最简单的实现:

let curry = function(fn){
    var args = [].slice.call(arguments, 1)
    return function(){
        var newArgs = args.concat([].slice.call(arguments));
        return fn.apply(this,newArgs)
    }
}

用法:

function add(a, b) {
    return a + b;
}
var addCurry;

addCurry = curry(add,1,2);
addCurry() //3
//或者
addCurry = curry(add,1);
addCurry(2) //3
//或者
addCurry = curry(add);
addCurry(1,2) //3

当然,这还没有达成柯里化的要求,不过已经有点意思了,我们在这个基础上可以继续往下写:

Comments
Write a Comment