Scala:两种方式之间的差异声明了一个函数

时间:2012-09-29 16:47:45

标签: scala functional-programming

  

可能重复:
  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

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

谢谢:)

1 个答案:

答案 0 :(得分:0)

前者采用currying,后者是你可能更熟悉C,C ++等语言的东西。

Currying在函数式编程语言中是突出的。函数式编程语言将函数和函数链的概念置于高度重视之中,如

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

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

正如Scala中的编程所讨论的那样,函数currying也让我们做了一些漂亮的事情,其中​​两个想到的是

  1. 类型推断
  2. 新控制抽象
  3. 对于类型推断,请考虑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将接受花括号代替括号,这使得上面看起来就像熟悉的控制结构,如forwhile循环。