函數柯理化,很多人覺得很難理解。其實難就難在它的翻譯并不恰當。如果翻譯成
部分綁定函數
含義是不是一目了然?學過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集其大成。