Lambda 咖喱只是“可选参数”?

Lambda 咖喱只是“可选参数”?,lambda,functional-programming,currying,Lambda,Functional Programming,Currying,我在网上读到一个家伙的声明,说咖喱只是一种拥有可选参数的奇特方式。凭直觉,我觉得这句话很肤浅而且是错误的,但我不能真正指出这一点,可能是因为我没有足够的lambda微积分知识 当我试图解释这种差异时,我的解释跨越了几段,主要归结到Currying,即使用较少的参数作为类型来实现函数声明的所有变体。但不能将具有可选参数的函数的所有组合作为有效类型,并在其他声明中使用它们,至少不能自动使用 我的方法一开始就正确吗?更重要的是,是否有一种更简单、更简单的方法来解释它?它与任何可选性无关 但是,您可以定

我在网上读到一个家伙的声明,说咖喱只是一种拥有可选参数的奇特方式。凭直觉,我觉得这句话很肤浅而且是错误的,但我不能真正指出这一点,可能是因为我没有足够的lambda微积分知识

当我试图解释这种差异时,我的解释跨越了几段,主要归结到Currying,即使用较少的参数作为类型来实现函数声明的所有变体。但不能将具有可选参数的函数的所有组合作为有效类型,并在其他声明中使用它们,至少不能自动使用


我的方法一开始就正确吗?更重要的是,是否有一种更简单、更简单的方法来解释它?

它与任何可选性无关

但是,您可以定义一个只接受一个参数的函数,并返回一个接受另一个参数的函数,而不是定义一个接受两个参数的函数


最终结果是相同的,调用者最终提供了两个参数,但使用currying时,一次只提供一个。

可选参数会产生不同的结果。Currying返回不同的函数。可选参数的值必须在编译时已知?@怀疑论者:取决于语言。@怀疑论者:IIRC,VB6的可选参数允许任何值。以防万一,请参阅。这里有一个有用的链接。一个很好的优势是,像这样,所有函数都只接受一个参数,并产生一个结果。@Martinho,这是一个什么优势?@ssg:从理论的角度来看,这很好,因为它使程序的推理更容易;多亏了自动咖喱,用户永远不需要注意,除非注意对他们有利。@ssg:更实用的优点是它为您提供了一种专门化函数的简单方法。以map这样的函数为例:一个对列表中的每个元素应用某些操作的通用函数。使用curry,您可以首先提供一些操作,从而生成一个专门的函数,将该特定函数应用于列表中的每个元素。Currying可以非常方便地编写非常通用和可重用的函数,然后根据特定用例的需要对它们进行专门化。在OOP中,对象构造函数是实现相同功能的一种糟糕的方法:在构造函数中提供一些初始数据,这会影响对象上的成员方法的工作方式。通常,能够分阶段为函数调用提供数据非常有用,首先提供一般数据,这些数据可以跨多个调用重用,然后分别提供每个调用的数据。