currying的实际优势是什么?

时间:2011-03-14 16:04:32

标签: functional-programming currying

我看到很多关于currying技术的文档和问题,但我发现很少有关于为什么会在实践中使用它的信息。我的问题是,currying有什么好处?也许你可以提供一个简单的例子,其中currying比传统的方法调用更可取。

我在太阳升起的时候用C ++工作,所以到目前为止,除了工作以外的语言修补外,我几乎没有接触过currying。

1 个答案:

答案 0 :(得分:13)

首先,将部分功能应用误认为是很常见的。例如,请参阅this(我确定有更好的资源描述它,但这是我发现的第一个)。我几乎从来没有见过有人在练习中使用currying(除了像Haskell这样的语言,其中每个函数都由语言本身来理解,可以这么说,但即使这样也是为了实现简单的部分函数应用)。另一方面,部分功能应用在许多语言中非常有用。

无论如何,假设你在谈论部分功能应用(因为这是大多数人在询问currying时所讨论的内容),这个概念在C ++中并不像(纯粹)功能语言那么自然,例如Haskell。

例如,在这里我们定义一个函数sum,它接受​​一个数字list数组并将所有数字相加在一起。如果你对折叠(或者有时被称为减少或注入)的概念不满意,请阅读this。无论如何,它看起来像这样:

sum list = foldl (+) 0 list

但等一下。我们可以通过使用部分功能应用来缩短它!我们只是说sum是一个等于foldl的函数,而不是提供一个参数,部分应用了+和0。

sum = foldl (+) 0

哪一个更容易阅读?可能是一个偏好的问题,但后者在我看来更清楚地强调了sum和foldl之间的关系。请注意这是一个非常简单的例子。老实说,我不知道如何用C ++编写一个很好的例子,所以你不得不原谅我。无论如何,实际优势是什么?可读性。更明确的意图。更短的代码。

免责声明:如果你真的想知道currying的优点(而不是部分功能应用程序),我很抱歉让你读完这一切。但另一方面,如果你理解两者之间的区别也会理解currying是实现部分函数应用的好方法。