Function Currying
2017-04-20 本文已影响0人
RocWay
函数柯理化,很多人觉得很难理解。其实难就难在它的翻译并不恰当。如果翻译成
部分绑定函数
含义是不是一目了然?学过C++,用过 STL std::bind函数的同学应该对这个翻译感到很亲切:这不就是名义上只接受部分参数,但其实底下偷偷补足其他参数的做法吗?
比如下面这个JS版的bind函数,它可以绑定函数的第一个参数(预先指定一个实参),从而生成一个新的函数:
var bind = function(fn, a){
return function(b){
return fn(a, b)
}
}
var mult = function(a, b){
return a*b
}
// 绑定mult的第一个参数a,譬如指定该参数为2
var time2 = bind(mult, 2)
// 调用新函数time2
time(1) // 得2
time(3) // 得6
当然,严谨一点来说,currying之后的函数只接受一个参数,这比一般的部分绑定函数形式上更加精炼。
之所以这种函数处理方式叫做currying,是源自美国的数学家兼逻辑学家,Haskell Curry。虽然不是他发明的,但是却是这种方式的发扬者。
最初由Gottlob Frege提出,经 Moses Schönfinkel发展,最终 Haskell Curry集其大成。