Scala Currying语法说明

时间:2016-08-05 15:52:37

标签: scala

我是scala的新手。

我想了解下面这段代码的语法

object PlainSimple {

 def main(args:Array[String])
 {
 val m = add(5) 
 println(m(3))
 }

 def add(x:Int):Int=>Int =
 {
  y=>y+x 
 }

}

我的问题是我们在哪里说add函数正在返回另一个函数?

Int=>Int是什么意思?

在add函数里面有什么叫y?为什么我们在没有声明的情况下使用它呢?

如果想在add方法中添加多行,需要做什么?

2 个答案:

答案 0 :(得分:6)

  

我的问题是我们在哪里说add函数正在返回另一个函数?

就在这里

def add(x: Int): Int => Int = y => y + x

Int => Int是一种函数类型。这只是语法糖,但你也可以把它写成

def add(x:Int): Function1[Int, Int] = y => y + x

现在,y是什么? y => y + x是一个lambda,即一个匿名函数。这个lambda接受一个我们现在称为y的参数。

这是对scala中匿名函数及其语法的一个很好的参考:http://docs.scala-lang.org/tutorials/tour/anonymous-function-syntax.html

为了在方法中有多行,只需使用大括号

def add(x:Int): Function1[Int, Int] = { y =>
  println("whaveter")  
  y + x
}

答案 1 :(得分:2)

  

我的问题是我们在哪里说add函数正在返回另一个函数?

     

什么是Int => Int表示?

T => U作为一种类型意味着“一个需要T并返回U”的函数。因此,当我们在函数签名的末尾写: Int => Int时,我们说“此函数返回从IntInt的函数”。

  

在add函数里面叫做y?为什么我们在没有声明的情况下使用它呢?

作为表达式x => body(或多个参数的(x,y,z) => body)是函数文字,即它定义了一个匿名函数,其参数名为x,其正文为{{1 }}。因此,我们通过写出body左侧的名称来声明参数x

  

如果想在add方法中添加多行,需要做什么?

在使用=>定义方法时,您可以在=>右侧放置任何可以放在=右侧的内容。因此,如果您希望函数的主体由多个语句组成,则可以像使用常规方法定义一样使用大括号:

def