我在几篇文章和博客中都看到过关于咖喱函数的引用,可是我找不到很好的解释(或者至少有一个合理的解释!) 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函数是重写了多个参数的函数,以便它接受第一个参数,并返回接受第二个参数的函数,依此类推。 这容许几个自变量的功能部分地应用其某些初始自变量。