0

可能重复:
Scala 中的柯里化函数背后的基本原理是什么?

我有两种不同的方法来声明一个函数:1)使用柯里化。2)使用函数作为参数。

这是我的代码:

def transform(f: Double => Double)(input: Double) = {
  f(input)
}                                                 

def transformVer2(f: Double => Double, input: Double) = {
  f(input)
}                                                 

transform(x=>x*x)(10)                             //> res8: Double = 100.0
transformVer2(x=>x*x, 10)                         //> res9: Double = 100.0

我不知道上述两个函数声明的真正区别是什么。请告诉我。

谢谢 :)

4

1 回答 1

0

前者使用柯里化,后者可能是你对 C、C++ 等语言更熟悉的东西。

柯里化是函数式编程语言中突出的东西。函数式编程语言高度重视函数和函数链的思想,所以像

def transform(f: Double => Double)(input: Double)

可以看作是一个函数作为单个参数Double => Double并返回另一个函数,该函数将 a 作为单个参数Double并返回 a Double

正如 Scala 中的编程所讨论的,函数柯里化也让我们做一些漂亮的事情,其中​​有两个是

  1. 类型推断
  2. 新的控制抽象

对于类型推断,请考虑类似foldLeft.

val myVector = Vector(1, 2, 3, 4)
myVector.foldLeft(0.0)(_ + _)

foldLeft被柯里化了,我们将其指定0.0为初始值,让类型推断器知道我们希望最终结果为Double.

对于新的控制抽象,我们可以做类似的事情

def doWithFileAndClose(file: File)(func: () => Unit): Unit =
  try { func() } finally { file.close }

这将像

doWithFileAndClose("somefile.txt") {
  /* do stuff */
}

这利用了 Scala 将接受花括号代替括号的优势,这使得上面看起来就像熟悉的控制结构,例如forwhile循环。

于 2012-09-29T17:39:07.063 回答