2012-09-29 81 views
0

可能重复:
What's the rationale behind curried functions in 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 

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

谢谢:)

+0

不,我不这么认为。在我的问题中,参数是一个函数:) – hqt

+0

它没有任何区别,它仍然是一个问题。 –

回答

0

前者采用钻营,后者则是一些你可能更熟悉的如C,C++等语言

柯里的东西是突出的函数式编程语言..函数式编程语言放在高一点的功能和功能链接的想法所以像

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

可以看作是一些需要作为一个参数的函数Double => Double并返回另一个函数,该函数将一个参数作为一个参数Double并返回Double

如Scala编程讨论,函数柯里也让我们做一些漂亮的东西,其中两个脑海中出现

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

对于类型推断,考虑像foldLeft

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

foldLeft是令行禁止,和我们指定0.0作为初始值,让我们的类型inferencer知道我们希望最终的结果是一个Double

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

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

这将用于像

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

这利用的是斯卡拉将在地方括号接受花括号,这使得上面看起来就像熟悉的控制结构,如forwhile循环。

+0

从函数转换的声明我们不知道它返回Double。 –