可能重复:
What's the rationale behind curried functions in Scala?
我有两种不同的方式来声明一个函数:1)使用currying。 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 :(得分:0)
前者采用currying,后者是你可能更熟悉C,C ++等语言的东西。
Currying在函数式编程语言中是突出的。函数式编程语言将函数和函数链的概念置于高度重视之中,如
def transform(f: Double => Double)(input: Double)
可以看作是一个函数Double => Double
作为单个参数的东西,并返回另一个函数,该函数将Double
作为单个参数并返回Double
。
正如Scala中的编程所讨论的那样,函数currying也让我们做了一些漂亮的事情,其中两个想到的是
对于类型推断,请考虑foldLeft
。
val myVector = Vector(1, 2, 3, 4)
myVector.foldLeft(0.0)(_ + _)
foldLeft
是curry,我们指定0.0
作为初始值让类型推断器知道我们希望我们的最终结果是Double
。
对于新的控件抽象,我们可以执行类似
的操作def doWithFileAndClose(file: File)(func: () => Unit): Unit =
try { func() } finally { file.close }
将像
一样使用doWithFileAndClose("somefile.txt") {
/* do stuff */
}
这有利于Scala将接受花括号代替括号,这使得上面看起来就像熟悉的控制结构,如for
和while
循环。