成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

函數加里化和偏函數應用的比較

開發 后端 開發工具
Currying:因為是美國數理邏輯學家哈斯凱爾·加里(Haskell Curry)發明了這種函數使用技巧,所以這樣用法就以他的名字命名為Currying,中文翻譯為“加里化”。

函數式編程

 

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

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

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

幾乎所有編程語言中都有非常明顯的偏函數應用。在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函數實際上就是一個foo函數的偏函數應用,參數b的值被固定為23。

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

例如,在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 
 

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

下面是一個單參數的Javascript函數:

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

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

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

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

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

當然,Javascript是支持多參數函數的:

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

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

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

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

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

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

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

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

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

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

兩個函數都能夠通過提供一個參數值來創造一個偏函數:

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

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

 

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

 

當作是下面這個函數的簡寫:

 

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

 

函數加里化和偏函數應用的總結

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

英文原文:Currying vs. Partial Application

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

責任編輯:林師授 來源: 外刊IT評論
相關推薦

2009-07-22 07:42:00

Scala偏應用函數

2010-11-18 15:46:41

Oracle Deco

2017-03-07 15:13:28

Scala偏函數函數

2010-03-11 11:10:14

Python函數式

2010-09-07 08:35:40

DB2常用函數

2020-09-23 16:07:52

JavaScript函數柯里化

2010-09-09 13:43:48

SQL函數NEWID

2009-02-24 15:39:27

字符串比較函數函數

2013-10-11 13:01:45

LinuxLinux Shell

2010-11-25 11:01:33

MySQL日期函數

2023-05-06 07:27:47

2010-07-20 09:52:27

Perl構造函數

2010-09-09 09:31:19

SQL函數left

2010-10-25 17:33:35

Oracle數學函數

2009-07-22 07:57:00

ScalaCurry化函數

2010-07-19 08:45:45

SQL Server

2010-04-30 11:41:39

Oracle常用函數

2009-02-24 16:17:41

日期時間函數

2025-02-06 13:23:09

C++函數參數

2010-09-08 15:24:28

TCP IP協議棧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费看a | 国产日产精品一区二区三区四区 | 国产第一区二区 | 国产精品精品久久久 | 91在线视频播放 | 欧美久久一区二区三区 | 91日韩在线 | 一区在线视频 | 成人自拍av | 国产欧美一级 | 国产精品久久久久久吹潮 | 请别相信他免费喜剧电影在线观看 | 日韩欧美国产一区二区三区 | 亚洲入口| 亚洲一区二区视频 | 日本人做爰大片免费观看一老师 | 国产一区二区在线视频 | 欧美精品在线免费 | 人人干在线 | 国产成人jvid在线播放 | 午夜免费网站 | 99亚洲精品 | 一级a性色生活片久久毛片 午夜精品在线观看 | 国产亚洲精品精品国产亚洲综合 | 亚洲伦理自拍 | 成人99| 特级丰满少妇一级aaaa爱毛片 | 日韩欧美国产成人一区二区 | 91福利在线导航 | 中文亚洲视频 | 精品在线一区 | 亚洲免费人成在线视频观看 | avtt国产| 成年人在线观看视频 | 久久精品一区二区 | 久久999| 九九九精品视频 | 日韩精品成人 | 国产色99精品9i | 日韩一区二区久久 | 毛片免费视频 |