【问题标题】:What are the practical advantages of currying?currying 的实际优势是什么?
【发布时间】:2011-07-15 03:27:11
【问题描述】:

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

我在太阳升起时使用 C++ 工作,所以到目前为止,除了在工作中修补语言之外,我几乎没有接触过柯里化。

【问题讨论】:

标签: functional-programming currying


【解决方案1】:

首先,将部分函数应用程序误认为柯里化是很常见的。例如,参见this(我确信有更好的资源来描述它,但这是我发现的第一个)。我几乎从未见过有人在实践中使用柯里化(除了像 Haskell 这样的语言,可以说每个函数都由语言本身柯里化,但即使这样也是为了启用简单的部分函数应用程序)。另一方面,偏函数应用在许多语言中都非常有用。

无论如何,假设您正在谈论部分函数应用程序(因为这是大多数人在询问柯里化时所谈论的内容),这个概念在 C++ 中并不像在(纯)函数式语言中那样自然,例如 Haskell。

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

sum list = foldl (+) 0 list

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

sum = foldl (+) 0

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

免责声明:如果您真的想知道柯里化(相对于部分函数应用程序)的优点,很抱歉让您阅读了所有这些内容。但另一方面,如果你了解了两者的区别,也会明白柯里化是实现偏函数应用的好方法。

【讨论】:

  • 我认为你的观点通过在你的第一个例子中的部分应用更清楚地说明了 + 。你也不需要currying来做部分应用吗?所以柯里化,因为将元组参数转换为柯里化参数的过程(例如 Haskell 中的 'curry' 函数)非常有用。
  • “可读性。更清晰的意图。更短的代码” - 坦率地说,考虑到函数代码通常不可读,这是一个非常弱的论点。我认为您只是在说“因为熟悉偏差”。
猜你喜欢
  • 2010-10-10
  • 2017-03-16
  • 1970-01-01
  • 2019-06-07
  • 2011-02-11
  • 2014-08-03
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多