We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。(接受部分参数,并且返回一个接受剩下参数新函数的函数,就是返回一个新函数) 这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。
在直觉上,柯里化声称如果你固定某些参数,你将得到接受余下参数的一个函数。 在理论计算机科学中,柯里化提供了在简单的理论模型中,比如:只接受一个单一参数的lambda演算中,研究带有多个参数的函数的方式。 函数柯里化的对偶是Uncurrying,一种使用匿名单参数函数来实现多参数函数的方法。
function bind(fn, context) { var slice = Array.prototype.slice; var args = slice.call(arguments, 2); return function () { return fn.apply(context, slice.call(arguments, 0).concat(args)); } }
上面的方法严格意义上来讲是一个偏函数,减少函数参数的个数的过程,柯里化是每次只传入一个参数的处理方式。
function currying(fn, context) { var slice = Array.prototype.slice; var args = slice.call(arguments, 2); return function () { if (arguments.length) { args = args.concat(slice.call(arguments, 0)); return arguments.callee; } else { return fn.apply(context || null, args); } } } function add() { var a = 0; for (var i = 0; i < arguments.length; i++) { a += arguments[i]; } console.log(a + this.a); } var obj = { a: 'hello', } currying(add, obj, 1)(2)(3, 4)(5)();
可能遇到这种情况:拿到一个柯里化后的函数,却想要它柯里化之前的版本,这本质上就是想将类似f(1)(2)(3)的函数变回类似g(1,2,3)的函数。
function uncurring(currying) { var ret = currying; return function () { for (var i = 0; i < arguments.length; i++) { ret = currying(arguments[i]) } return ret; } }
反复调用currying版本的函数,而不是真的转换为另一种函数
无论是柯里化还是偏应用,我们都能进行部分传值,而传统函数调用则需要预先确定所有实参。如果你在代码某一处只获取了部分实参,然后在另一处确定另一部分实参,这个时候柯里化和偏应用就能派上用场。
另一个最能体现柯里化应用的的是,当函数只有一个形参时,我们能够比较容易地组合它们(单一职责原则(Single responsibility principle))。因此,如果一个函数最终需要三个实参,那么它被柯里化以后会变成需要三次调用,每次调用需要一个实参的函数。当我们组合函数时,这种单元函数的形式会让我们处理起来更简单。
归纳下来,主要为以下常见的三个用途:
延迟计算 参数复用 动态生成函数
The text was updated successfully, but these errors were encountered:
No branches or pull requests
官方的说法
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。(接受部分参数,并且返回一个接受剩下参数新函数的函数,就是返回一个新函数)
这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。
在直觉上,柯里化声称如果你固定某些参数,你将得到接受余下参数的一个函数。
在理论计算机科学中,柯里化提供了在简单的理论模型中,比如:只接受一个单一参数的lambda演算中,研究带有多个参数的函数的方式。
函数柯里化的对偶是Uncurrying,一种使用匿名单参数函数来实现多参数函数的方法。
使用柯里化实现bind方法
上面的方法严格意义上来讲是一个偏函数,减少函数参数的个数的过程,柯里化是每次只传入一个参数的处理方式。
我们在使用柯里化时,要注意同时为函数预传的参数的情况。
反柯里化
可能遇到这种情况:拿到一个柯里化后的函数,却想要它柯里化之前的版本,这本质上就是想将类似f(1)(2)(3)的函数变回类似g(1,2,3)的函数。
反复调用currying版本的函数,而不是真的转换为另一种函数
柯里化的作用
无论是柯里化还是偏应用,我们都能进行部分传值,而传统函数调用则需要预先确定所有实参。如果你在代码某一处只获取了部分实参,然后在另一处确定另一部分实参,这个时候柯里化和偏应用就能派上用场。
另一个最能体现柯里化应用的的是,当函数只有一个形参时,我们能够比较容易地组合它们(单一职责原则(Single responsibility principle))。因此,如果一个函数最终需要三个实参,那么它被柯里化以后会变成需要三次调用,每次调用需要一个实参的函数。当我们组合函数时,这种单元函数的形式会让我们处理起来更简单。
归纳下来,主要为以下常见的三个用途:
延迟计算
参数复用
动态生成函数
The text was updated successfully, but these errors were encountered: