日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
函數(shù)加里化和偏函數(shù)應(yīng)用的比較

 

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

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

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

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

 
 
 
 
  1. int foo(int a, int b, int c) {  
  2.  
  3.   return a + b + c;  
  4. }  
  5.  
  6. int foo23(int a, int c) {  
  7.   return foo(a, 23, c);  
  8.  

 

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

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

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

 
 
 
 
  1. from functools import partial  
  2.  
  3. def foo(a,b,c):  
  4.  
  5.   return a + b + c  
  6.  
  7. foo23 = partial(foo, b=23)  
  8.  
  9. 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ù):

 

 
 
 
 
  1. var foo = function(a) {  
  2.  
  3.   return a * a;  

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

 

 
 
 
 
  1. var foo = function(a) {  
  2.  
  3.   return function(b) {  
  4.     return a * a + b * b;  
  5.  
  6.   }  

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

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

當(dāng)然,Javascript是支持多參數(shù)函數(shù)的:

 

 
 
 
 
  1. var bar = function(a, b) {  
  2.  
  3.   return a * a + b * b;  
  4.  

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

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

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

 

 
 
 
 
  1. let foo = fun a ->  
  2.  
  3.   fun b ->  
  4.     a * a + b * b 

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

 

 
 
 
 
  1. let bar = fun a b ->  
  2.  
  3.   a * a + b * b 

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

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

 
 
 
 
  1. # foo 3 4;;  
  2. - : int = 25 
  3. # bar 3 4;;  
  4. - : int = 25 

 

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

 

 
 
 
 
  1. # let foo5 = foo 5;;  
  2. val foo5 : int -> int =   
  3.  
  4. # let bar5 = bar 5;;  
  5. val bar5 : int -> int =   
  6. # foo5 12;;  
  7. - : int = 169 
  8. # bar5 12;;  
  9. - : int = 169 

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

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

 

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

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

 

函數(shù)加里化和偏函數(shù)應(yīng)用的總結(jié)

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

英文原文:Currying vs. Partial Application

譯文連接:http://www.aqee.net/currying-partial-application/


本文標(biāo)題:函數(shù)加里化和偏函數(shù)應(yīng)用的比較
文章網(wǎng)址:http://www.5511xx.com/article/dhepgod.html