22

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

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

4

1 回答 1

14

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

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

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

sum list = foldl (+) 0 list

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

sum = foldl (+) 0

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

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

于 2011-03-14T16:33:53.317 回答