2016-04-12 99 views
1

我是新來的Scala,下面有三個的函數定義混亂對我說:斯卡拉:函數聲明的區別

首先

scala> def sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int 

scala> def sum (a: Int, b: Int) = a + b 
sum: (a: Int, b: Int)Int 

第三

scala> val sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int = <function2> 

我知道第二個是方法,第三個是函數文字。 我的疑惑是第一個聲明,這是一個正常的函數還是它是我不明白的一些其他語法?一個解釋將不勝感激。

編輯

此外,當我嘗試使用第一個聲明,我得到這個創建一個部分應用功能:

scala> val anotherSum = sum _ 
anotherSum:() => (Int, Int) => Int = <function0> 

對此我預計Function2類型爲sum有2個參數。

+0

希望這有助於:http://www.tutorialspoint.com/scala/scala_closures.htm。在周圍挖掘scala閉包,, – Pavel

+0

「我知道第二個是正常功能」 - 不,第二個是方法,而不是函數。第一個也是一個方法(儘管返回一個函數)。只有第三個是功能。 –

+0

@JörgWMittag謝謝,我更新了我的問題。 –

回答

3

第一個和第二個聲明聲明不同的東西。不同的語法不一樣。

scala> def sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int 

在這裏,你定義一個名爲sum方法不帶參數,並返回一個函數,它有兩個Int參數和返回Int

所以,sum方法返回功能兩數相加的。

scala> def sum (a: Int, b: Int) = a + b 
sum: (a: Int, b: Int)Int 

在這裏,你定義一個名爲sum方法,它有兩個Int參數和返回Int

因此,sum方法,它增加了兩個數字。

區別在於,在第一個版本中,sum不接受任何參數並返回一個函數,而在第二個版本中,sum接受兩個參數並返回一個Int。兩件完全不同的事情!

第三:

scala> val sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int = <function2> 

在這裏定義一個命名sum這是一個Function2,換句話說,它有兩個Int參數和返回Int的功能。

因此,sum,其類型爲Function2,並且是指添加兩個數字的函數。

額外:在類型仔細

scala> val anotherSum = sum _ 
anotherSum:() => (Int, Int) => Int = <function0> 

看。 anotherSum是一個不帶參數的函數,該函數返回一個函數,該函數需要返回Int的兩個參數Int

你在這裏沒有部分應用任何東西。 Scala語言規範的Section 6.7 Method Values解釋了這裏發生的事情。

+0

感謝您的精彩解釋。 –