函數(shù)柯里化(Currying)和偏函數(shù)應用(部分應用函數(shù))(Partial Application)的比較

【名詞解釋】Currying:因為是美國數(shù)理邏輯學家哈斯凱爾·加里(Haskell Curry)發(fā)明了這種函數(shù)使用技巧,所以這樣用法就以他的名字命名為 Currying沉唠,中文翻譯為“柯里化”仲锄。

我感覺很多人都對函數(shù)柯里化(Currying)和偏函數(shù)應用(Partial Application)之間的區(qū)別搞不清楚署鸡,尤其是在相似的上下文環(huán)境中它們同時出現(xiàn)的時候额嘿。

偏函數(shù)解決這樣的問題:如果我們有函數(shù)是多個參數(shù)的交洗,我們希望能固定其中某幾個參數(shù)的值愧哟。

幾乎所有編程語言中都有非常明顯的偏函數(shù)應用奥吩。在C語言中:

int foo (int a, int b, int c) {

  return a + b + c;
}

int foo23(int a, int c) {
  return foo (a, 23, c);

}

foo23 函數(shù)實際上就是一個 foo 函數(shù)的偏函數(shù)應用,參數(shù) b 的值被固定為 23蕊梧。

當然霞赫,像這樣明顯的偏函數(shù)并沒有太大的用處;我們通常會希望編程語言能提供我們某些偏函數(shù)特征肥矢。

例如端衰,在 Python 語言中,我們可以這樣做:

from functools import partial

def foo (a,b,c):

  return a + b + c

foo23 = partial (foo, b=23)

foo23(a = 1, c = 3) # => 27

函數(shù)柯里化(Currying)明顯解決的是一個完全不同的問題:如果我們有幾個 單參數(shù) 函數(shù)橄抹,并且這是一種支持一等函數(shù)(first-class)的語言靴迫,如何去實現(xiàn)一個多參數(shù)函數(shù)?函數(shù)柯里化是一種 實現(xiàn)多參數(shù)函數(shù)的方法楼誓。

下面是一個單參數(shù)的 Javascript 函數(shù):

var foo = function(a) {

  return a * a;
}

如果我們受限只能寫單參數(shù)函數(shù)玉锌,可以像下面這樣模擬出一個多參數(shù)函數(shù):

var foo = function(a) {

  return function(b) {
    return a * a + b * b;

  }
}

通過這樣調(diào)用它: (foo (3))(4) ,或直接 foo (3)(4) 疟羹。

注意主守,函數(shù)柯里化提供了一種非常自然的方式來實現(xiàn)某些偏函數(shù)應用。如果你希望函數(shù) foo 的第一個參數(shù)值被固定成5榄融,你需要做的就是 var foo5 = foo (5) 参淫。這就 OK 了。函數(shù) foo5 就是 foo 函數(shù)的偏函數(shù)愧杯。注意涎才,盡管如此,我們沒有很簡單的方法對 foo 函數(shù)的第二個參數(shù)偏函數(shù)化(除非先偏函數(shù)化第一個參數(shù))力九。

當然耍铜,Javascript 是支持多參數(shù)函數(shù)的:

var bar = function(a, b) {

  return a * a + b * b;

}

我們定義的 bar 函數(shù)并不是一個柯里化的函數(shù)。調(diào)用 bar (5) 并不會返回一個可以輸入 12 的函數(shù)跌前。我們只能像 bar (5,12) 這樣調(diào)用這個函數(shù)棕兼。

在一些其它語言里,比如 Haskell 和 OCaml抵乓,所有的多參數(shù)函數(shù)都是通過柯里化實現(xiàn)的伴挚。

下面是一個把上面的 foo 函數(shù)用 OCaml 語言寫成的例子:

let foo = fun a ->

 fun b ->
   a * a + b * b

下面是把上面的 bar 函數(shù)用 OCaml 語言寫成的例子:

let bar = fun a b ->

  a * a + b * b

頭一個函數(shù)我們叫做“顯式柯里化”靶衍,第二個叫做“隱式柯里化”。

跟 Javascript 不一樣茎芋,在 OCaml 語言里颅眶, foo 函數(shù)和 bar 函數(shù)是完全一樣的。我們用完全一樣的方式調(diào)用它們败徊。

# foo 3 4;;
- : int = 25
# bar 3 4;;
- : int = 25

兩個函數(shù)都能夠通過提供一個參數(shù)值來創(chuàng)造一個偏函數(shù):

# let foo5 = foo 5;;
val foo5 : int -> int = <fun>

# let bar5 = bar 5;;
val bar5 : int -> int = <fun>
# foo5 12;;
- : int = 169
# bar5 12;;
- : int = 169

事實上帚呼,我們可以把下面這個匿名函數(shù):

fun arg1 arg2 ... argN -> exp

當作是下面這個函數(shù)的簡寫:

fun arg1 -> fun arg2 -> ... -> fun argN -> exp

函數(shù)柯里化和偏函數(shù)應用的總結(jié)

偏函數(shù)應用是找一個函數(shù),固定其中的幾個參數(shù)值皱蹦,從而得到一個新的函數(shù)煤杀。
函數(shù)柯里化是一種使用匿名單參數(shù)函數(shù)來實現(xiàn)多參數(shù)函數(shù)的方法。
函數(shù)柯里化能夠讓你輕松的實現(xiàn)某些偏函數(shù)應用沪哺。
有些語言(例如 Haskell, OCaml)所有的多參函數(shù)都是在內(nèi)部通過函數(shù)柯里化實現(xiàn)的沈自。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辜妓,隨后出現(xiàn)的幾起案子枯途,更是在濱河造成了極大的恐慌,老刑警劉巖籍滴,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酪夷,死亡現(xiàn)場離奇詭異,居然都是意外死亡孽惰,警方通過查閱死者的電腦和手機晚岭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勋功,“玉大人坦报,你說我怎么就攤上這事】裥” “怎么了片择?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骚揍。 經(jīng)常有香客問我字管,道長,這世上最難降的妖魔是什么信不? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任纤掸,我火速辦了婚禮,結(jié)果婚禮上浑塞,老公的妹妹穿的比我還像新娘。我一直安慰自己政己,他們只是感情好酌壕,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布掏愁。 她就那樣靜靜地躺著,像睡著了一般卵牍。 火紅的嫁衣襯著肌膚如雪果港。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天糊昙,我揣著相機與錄音辛掠,去河邊找鬼。 笑死释牺,一個胖子當著我的面吹牛萝衩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播没咙,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猩谊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祭刚?” 一聲冷哼從身側(cè)響起牌捷,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涡驮,沒想到半個月后暗甥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捉捅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年撤防,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锯梁。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡即碗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陌凳,到底是詐尸還是另有隱情剥懒,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布合敦,位于F島的核電站初橘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏充岛。R本人自食惡果不足惜保檐,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崔梗。 院中可真熱鬧夜只,春花似錦、人聲如沸蒜魄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旅挤,卻和暖如春踢关,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粘茄。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工签舞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柒瓣。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓儒搭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘹朗。 傳聞我的和親對象是個殘疾皇子师妙,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容