currying的实际优势是什么?

MM.*_*MM. 20 functional-programming currying

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

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

Jak*_*kob 13

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

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

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

sum list = foldl (+) 0 list
Run Code Online (Sandbox Code Playgroud)

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

sum = foldl (+) 0
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我认为通过简单地在第一个例子中部分应用+来更清楚地说明你的观点.你也不需要currying能够做部分应用吗?因此,curry,因为将tupled参数转换为curried参数(例如Haskell中的'curry'函数)的过程非常有用. (3认同)
  • “可读性。更清晰的意图。更短的代码” - 坦率地说,这是一个非常弱的论点,考虑到通常不可读的函数代码。我认为您只是在说“因为熟悉偏见”。 (2认同)