Functional programming 咖喱的实际好处是什么?

Functional programming 咖喱的实际好处是什么?,functional-programming,currying,Functional Programming,Currying,我看到了很多关于咖喱技巧是什么的文档和问题,但我发现很少有人会在实践中使用咖喱技巧。我的问题是,咖喱有什么好处?也许您可以提供一个简单的示例,其中curry比传统的方法调用更可取 我在C++中工作,而太阳升起来了,所以到目前为止我很少接触到除工作以外的语言修编。 首先,错误的部分函数应用程序是很常见的。请参阅示例(我确信有更好的资源来描述它,但这是我找到的第一个)。我几乎从未见过有人在实践中使用curry(除了Haskell这样的语言,可以说,每个函数都是由语言本身来实现的,但即使是为了实现简单

我看到了很多关于咖喱技巧是什么的文档和问题,但我发现很少有人会在实践中使用咖喱技巧。我的问题是,咖喱有什么好处?也许您可以提供一个简单的示例,其中curry比传统的方法调用更可取


<>我在C++中工作,而太阳升起来了,所以到目前为止我很少接触到除工作以外的语言修编。

首先,错误的部分函数应用程序是很常见的。请参阅示例(我确信有更好的资源来描述它,但这是我找到的第一个)。我几乎从未见过有人在实践中使用curry(除了Haskell这样的语言,可以说,每个函数都是由语言本身来实现的,但即使是为了实现简单的部分函数应用)。另一方面,部分函数应用程序在许多语言中非常有用

无论如何,假设你在讨论部分函数应用(因为这是大多数人在询问关于Currun时所讨论的),这个概念在C++中不如在纯函数语言中自然,例如Haskell。 例如,这里我们定义了一个函数

sum
,它接受一个数字数组
list
,并将所有数字相加。如果你不熟悉fold(或reduce或inject,有时称之为)的概念,请阅读。无论如何,它看起来是这样的:

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

sum = foldl (+) 0

哪一个更容易阅读?可能是偏好的问题,但我认为后者更清楚地强调了sum和foldl之间的关系。请考虑到这是一个非常简单的例子。老实说,我不知道如何在C++中写一个好的例子,所以你必须原谅我。在任何情况下,实际优势是什么?可读性。更清晰的意图。较短的代码


免责声明:如果你真的想知道咖喱(相对于部分函数应用)的优点,很抱歉让你读了这些。但另一方面,如果您了解这两者之间的区别,您也会明白,咖喱是实现部分功能应用程序的一种很好的方式。

这似乎是相关的:--它回答了您的问题吗?谢谢。雅各布的帖子给了我很多关于这件事的见解。链接的帖子建立在这个基础上。在这个答案中有一个简单的、非理论性的例子:我认为你的观点在你的第一个例子中简单地部分应用了+就更清楚地说明了。你不需要咖喱来做部分应用吗?因此,curry,作为将元组参数转换为curry参数的过程(例如Haskell中的“curry”函数),是非常有用的。“可读性。更清晰的意图。更短的代码”-坦率地说,考虑到函数代码通常是多么不可读,这是一个非常弱的参数。我想你只是在说“因为熟悉性偏见”。