函数柯理化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数柯理化相关的知识,希望对你有一定的参考价值。
通常创建柯理化函数的方式:
function curry(fn){
var args = Array.prototype.slice.call(arguments, 1);
return function(){
var innerArgs = Array.prototype.slice.call(arguments),
finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
}
curry函数的主要任务是安排好返回函数的参数,所有参数都被传进args,除了第一个(fn),然后里面的函数也把所有参数复制下来,和args合并以后放进fn里。
使用:
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = curry(add, 5);
alert(curriedAdd(3)); //8
function currying通常是作为function bind的一部分,用来创建更加复杂的bind函数:
function bind(fn, context){
var args = Array.prototype.slice.call(arguments, 2);
return function(){
var innerArgs = Array.prototype.slice.call(arguments),
finalArgs = args.concat(innerArgs);
return fn.apply(context, ?nalArgs);
};
}
这样就可以传入参数了:
var handler = {
message: “Event handled”,
handleClick: function(name, event){
alert(this.message + “:” + name + “:” + event.type);
}
};
var btn = document.getElementById(“my-btn”);
EventUtil.addHandler(btn, “click”, bind(handler.handleClick, handler,
“my-btn”));
Ecmascript 5的bind是支持function currying的,直接传进入你想添加的参数就行了:
var handler = {
message: “Event handled”,
handleClick: function(name, event){
alert(this.message + “:” + name + “:” + event.type);
}
};
var btn = document.getElementById(“my-btn”);
EventUtil.addHandler(btn, “click”, handler.handleClick.bind(handler, “my-btn”));
function curry(fn){
var args = Array.prototype.slice.call(arguments, 1);
return function(){
var innerArgs = Array.prototype.slice.call(arguments),
finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
}
curry函数的主要任务是安排好返回函数的参数,所有参数都被传进args,除了第一个(fn),然后里面的函数也把所有参数复制下来,和args合并以后放进fn里。
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = curry(add, 5);
alert(curriedAdd(3)); //8
function bind(fn, context){
var args = Array.prototype.slice.call(arguments, 2);
return function(){
var innerArgs = Array.prototype.slice.call(arguments),
finalArgs = args.concat(innerArgs);
return fn.apply(context, ?nalArgs);
};
}
var handler = {
message: “Event handled”,
handleClick: function(name, event){
alert(this.message + “:” + name + “:” + event.type);
}
};
var btn = document.getElementById(“my-btn”);
EventUtil.addHandler(btn, “click”, bind(handler.handleClick, handler,
“my-btn”));
var handler = {
message: “Event handled”,
handleClick: function(name, event){
alert(this.message + “:” + name + “:” + event.type);
}
};
var btn = document.getElementById(“my-btn”);
EventUtil.addHandler(btn, “click”, handler.handleClick.bind(handler, “my-btn”));
当需要特定执行上下文环境,或者缺少执行环境时适合用,bind和curry还可以用来创建复杂算法等。但都不应该被滥用,会有更多开销
偏函数应用(Partial Application) 解决这样的问题:如果我们有函数是多个参数的,我们希望能固定其中某几个参数的值。
函数柯里化(Currying)明显解决的是一个完全不同的问题:如果我们有几个单参数函数,并且这是一种支持一等函数(first-class)的语言,如何去实现一个多参数函数?函数加里化是一种实现多参数函数的方法。
偏函数应用是找一个函数,固定其中的几个参数值,从而得到一个新的函数。
函数柯里化是一种使用匿名单参数函数来实现多参数函数的方法。
函数柯里化能够让你轻松的实现某些偏函数应用。
有些语言(例如 Haskell, OCaml)所有的多参函数都是在内部通过函数加里化实现的。
以上是关于函数柯理化的主要内容,如果未能解决你的问题,请参考以下文章