【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
我在几篇文章和博客中都看到过关于咖喱函数的引用,但是我找不到很好的解释(或者至少有一个合理的解释!)
#1楼
在函数的代数中,处理带有多个自变量(或等效的一个自变量为N元组)的函数有些微不足道-但是,正如MosesSchönfinkel(以及独立的Haskell Curry)证明的那样,不需要它:所有人需要的是带有一个参数的函数。
那么如何处理自然表达为f(x,y)
呢? 好吧,您认为这等效于f(x)(y)
f(x)
,称它为g
是一个函数,然后将该函数应用于y
。 换句话说,您只有带有一个参数的函数-但是其中一些函数会返回其他函数(也带有一个参数;-)。
像往常一样, 维基百科对此有一个很好的总结条目,其中包含许多有用的指针(可能包括与您喜欢的语言有关的指针;-)以及更为严格的数学处理方法。
#2楼
我发现本文及其引用的文章对更好地了解currying很有用: http : //blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx
正如其他人提到的那样,这只是拥有一个参数函数的一种方式。
这很有用,因为您不必假设要传入多少个参数,因此您不需要2个参数,3个参数和4个参数函数。
#3楼
这是一个具体的例子:
假设您有一个计算作用在物体上的重力的函数。 如果您不知道公式,可以在这里找到。 此函数将三个必需参数作为参数。
现在,在地球上,您只想计算该星球上物体的力。 用功能语言,您可以将地球质量传递给功能,然后对其进行部分评估。 您会得到的是另一个仅使用两个参数并计算地球上物体的重力的函数。 这称为“咖喱”。
#4楼
这是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实现此方法的部分对象与函数的区别。
#5楼
curried函数是重写了多个参数的函数,以便它接受第一个参数,并返回接受第二个参数的函数,依此类推。 这允许几个自变量的功能部分地应用其某些初始自变量。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3151327