【问题标题】:Currying is just "optional parameters"?柯里化只是“可选参数”?
【发布时间】:2011-02-15 18:15:01
【问题描述】:

我在网上读到一个人的声明说“currying 只是一种具有可选参数的奇特方式”。凭直觉,我觉得这种说法肤浅且错误,但我无法真正指出它,可能是因为我对 lambda 演算的知识不够。

当我试图解释差异时,我的解释跨越了段落,主要归结为“Currying 是将函数声明的所有变体作为类型的参数数量较少。但是你不能将函数与可选参数的所有组合作为有效类型并在其他声明中使用它们,至少不会自动使用”。

我的方法一开始是正确的吗,更重要的是有没有更简单、更通俗易懂的方式来解释它?

【问题讨论】:

  • 可选参数产生不同的结果。柯里化返回不同的函数。
  • 可选参数的值必须在编译时知道?
  • @Skeptic:取决于语言。
  • @Skeptic:IIRC,VB6 的可选参数允许任何值。
  • 以防万一,请参阅"Practical use of curried functions?"。那里有一个有用的链接。

标签: lambda functional-programming currying


【解决方案1】:

它与任何可选无关。

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

最终结果是一样的(调用者最终提供了两个参数),但是使用柯里化,您一次只提供一个。

【讨论】:

  • 一个很好的优势是这样一个事实,所有函数都只接受一个参数并产生一个结果。
  • @Martinho,这有什么优势?
  • @ssg:从理论上讲,这很好,因为它使推理程序更容易;并且由于自动柯里化,用户永远不需要注意,除非注意对他们有利。
  • @ssg:一个更实际的优势是它为您提供了一种专门化功能的简单方法。以map 之类的函数为例:一个通用函数,它将 some 操作应用于列表中的每个元素。使用currying,您可以首先提供这个“一些操作”,从而产生一个专门的函数,该函数将该特定函数应用于列表中的每个元素。 Currying 使得编写极其通用和可重用的函数变得非常方便,然后根据特定用例的需要对它们进行专门化。
  • 在 OOP 中,对象构造函数是一种糟糕的实现相同目标的方式:在构造函数中,您提供一些“初始”数据,这会影响对象上的成员方法的工作方式。能够为函数调用分阶段提供数据通常非常有用,首先提供通用数据,这些数据可以在多个调用中重复使用,然后分别提供每个调用的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2011-07-01
  • 2013-06-03
  • 2021-04-04
相关资源
最近更新 更多