柯里化名词解释
柯里化简单实现
var add = function(a, b){
return a + b;
}
var addCurry = function(a){
return function (b) {
return a + b;
};
}
var addCurryTest = addCurry(1)
console.log(add(1,2));
console.log(addCurryTest(4));
- JavaScript并没有实现curry方法,但我们可以给Function.prototype扩展此功能。柯里化通用实现:
var add = function(a, b){
return a + b;
}
Function.prototype.method = function (name, func) {
if(!this.prototype[name]){
this.prototype[name] = func;
}
return this;
}
Function.method('curry', function () {
var slice = Array.prototype.slice;
var args = slice.apply(arguments);
console.log(args);
var that = this;
return function () {
console.log(slice.apply(arguments));
return that.apply(null, args.concat(slice.apply(arguments)));
}
})
var addTest = add.curry(1);
console.log(addTest(6));
柯里化应用
参数复用
Function.prototype.method = function (name, func) {
if(!this.prototype[name]){
this.prototype[name] = func;
}
return this;
}
Function.method('curry', function () {
var slice = Array.prototype.slice;
var args = slice.apply(arguments);
var that = this;
return function () {
return that.apply(null, args.concat(slice.apply(arguments)));
}
})
function check(reg, text){
return reg.test(text);
}
var hasNumber = check.curry(/\d+/g);
var hasLetter = check.curry(/[a-z]+/g);
console.log(hasNumber('test1'));
console.log(hasNumber('asdasd'));
console.log(hasLetter('123123123'));
console.log(hasLetter('Hello'));
延迟运行(js中的bind实现机制就是currying)
var sum = function () {
let sum = 0;
for(let i = 0; i < arguments.length; i++){
sum += arguments[i];
}
return sum;
}
Function.prototype.bind = function (context) {
var _this = this
var args = Array.prototype.slice.call(arguments, 1)
return function() {
return _this.apply(context, args)
}
}
console.log(sum.bind(null, 1, 1, 3, 5)());
var curry = function(fn) {
var _args = []
return function cb() {
if (arguments.length == 0) {
return fn.apply(this, _args)
}
Array.prototype.push.apply(_args, arguments);
return cb;
}
}
console.log(curry(sum)(1,2,3)(1,2)())