我在幾篇文章和博客中都看到過關於咖喱函數的引用,可是我找不到很好的解釋(或者至少有一個合理的解釋!) html
在函數的代數中,處理帶有多個自變量(或等效的一個自變量爲N元組)的函數有些微不足道-可是,正如MosesSchönfinkel(以及獨立的Haskell Curry)證實的那樣,不須要它:全部人須要的是帶有一個參數的函數。 python
那麼如何處理天然表達爲f(x,y)
呢? 好吧,您認爲這等效於f(x)(y)
f(x)
,稱它爲g
是一個函數,而後將該函數應用於y
。 換句話說,您只有帶有一個參數的函數-可是其中一些函數會返回其餘函數(也帶有一個參數;-)。 程序員
像往常同樣, 維基百科對此有一個很好的總結條目,其中包含許多有用的指針(可能包括與您喜歡的語言有關的指針;-)以及更爲嚴格的數學處理方法。 app
我發現本文及其引用的文章對更好地瞭解currying頗有用: http : //blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx ide
正如其餘人提到的那樣,這只是擁有一個參數函數的一種方式。 函數
這頗有用,由於您沒必要假設要傳入多少個參數,所以您不須要2個參數,3個參數和4個參數函數。 spa
這是一個具體的例子: 指針
假設您有一個計算做用在物體上的重力的函數。 若是您不知道公式,能夠在這裏找到。 此函數將三個必需參數做爲參數。 code
如今,在地球上,您只想計算該星球上物體的力。 用功能語言,您能夠將地球質量傳遞給功能,而後對其進行部分評估。 您會獲得的是另外一個僅使用兩個參數並計算地球上物體的重力的函數。 這稱爲「咖喱」。 htm
這是Python中的一個玩具示例:
>>> from functools import partial as curry >>> # Original function taking three parameters: >>> def display_quote(who, subject, quote): print who, 'said regarding', subject + ':' print '"' + quote + '"' >>> display_quote("hoohoo", "functional languages", "I like Erlang, not sure yet about Haskell.") hoohoo said regarding functional languages: "I like Erlang, not sure yet about Haskell." >>> # Let's curry the function to get another that always quotes Alex... >>> am_quote = curry(display_quote, "Alex Martelli") >>> am_quote("currying", "As usual, wikipedia has a nice summary...") Alex Martelli said regarding currying: "As usual, wikipedia has a nice summary..."
(只需經過+使用串聯,以免非Python程序員分心。)
編輯添加:
請參閱http://docs.python.org/library/functools.html?highlight=partial#functools.partial ,該文件還顯示了Python實現此方法的部分對象與函數的區別。
curried函數是重寫了多個參數的函數,以便它接受第一個參數,並返回接受第二個參數的函數,依此類推。 這容許幾個自變量的功能部分地應用其某些初始自變量。