Scala函数定义和用法

时间:2014-03-30 17:57:18

标签: scala lambda

基于以下定义函数的示例,在不同场景中2和3的最佳用途是什么?

  1. def sum(x: Int, y: Int): Int = { x+y } 这是一个带参数,返回类型和函数体的函数定义

  2. val sum = (x: Int, y: Int) => { x+y } 这似乎是一个lambda函数赋值给变量,为什么返回类型永远不会在这里定义?

  3. val sum: (Int, Int) => Int = (x,y) => { x+y } 这是将函数定义为一种类型? 我不明白这是如何运作的!

  4. 调用时所有3个函数都会产生相同的结果:

    scala> sum(1,2) Int = 3

3 个答案:

答案 0 :(得分:5)

  
      
  1. def sum(x: Int, y: Int): Int = { x+y }   这是一个带参数,返回类型和函数体的函数定义
  2.   

这是函数定义。这是方法定义。函数和方法从根本上不同。函数是对象,方法不是。 (方法属于对象。)方法可以是多态的,函数可以是

  
      
  1. val sum = (x: Int, y: Int) => { x+y }   这似乎是一个lambda函数赋值给变量,为什么返回类型永远不会在这里定义?
  2.   

您是在问为什么sum的类型没有被声明,或者为什么函数文字的返回类型没有被声明?函数文字的返回类型未被声明,因为语法中没有办法这样做。您只是不能声明函数文字的返回类型,它总是被推断出来。 sum的类型未被声明,因为它没有必要:可以推断它与函数文字的类型相同,即Function2[Int, Int, Int]

思考val foo = "Hello"

  
      
  1. val sum: (Int, Int) => Int = (x,y) => { x+y }   这是将函数定义为类型?
  2.   

没有。这与2.完全相同,只是在这里明确声明了sum的类型((Int, Int) => Int,它是Function[Int, Int, Int])的语法糖而不是推断。由于sum的类型是已知的,因此您可以省略函数参数的类型,因为它们可以从上下文中推断出来。

思考val foo: String = "Hello"

答案 1 :(得分:0)

在第2行中,scala编译器推断出lambda函数的类型。

val sum = (x: Int, y: Int) => { x + y }
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          function value

x y 是Int的类型,因此 x + y 是Int类型。在这种情况下, sum 的类型是 (Int,Int)=> INT

在第3行中,它显示了sum的类型 - (Int,Int)=> INT 即可。 sum 表示与第2行相同的功能。

val sum: (Int, Int) => Int = (x,y) => { x+y }
         ~~~~~~~~~~~~~~~~~   ~~~~~~~~~~~~~~~~
         type                function value

= 的右侧是功能签名和正文。它接收两个名为 x y 的参数。它的身体 x + y

很快,第2行和第3行是等价的。第2行没有函数值类型,但scala可以推断其类型。第3行显式有函数值类型,省略函数值的签名参数类型。

答案 2 :(得分:0)

这是关于方法和功能之间的区别。显示差异的有用链接是http://java.dzone.com/articles/revealing-scala-magician%E2%80%99s

我认为在第三种方式中,你可以理解它类型为T =(Int,Int)=> Int然后这样做:val sum:T =(x,y)=> {x + y}

另一件事是,如果删除输入参数,方法和功能是不同的。

def sum:Int = {3} // call sum,get 3

val sum :()=> Int =()=> {3} //调用sum,返回一个函数,需要调用sum()来得到3