2013-07-05 118 views
1

在Scala中,一個名爲函數定義爲:爲什麼類型名函數從匿名一個Scala的不同

scala> def addOne(x: Int): Int = x+1 
addOne: (x: Int)Int 

scala> :type addOne 
(x: Int)Int 

而一個匿名一個爲:

scala> val addOne = (x:Int) => x+1 
addOne: Int => Int = <function1> 

scala> :type addOne 
Int => Int 

爲什麼他們類型看起來不同?

爲什麼命名函數不能作爲參數傳遞給另一個函數?

不應該從類型和一階行爲的角度來統一處理?

回答

4

def addOne(x: Int): Int不是scala中的函數。這是一些對象的方法。

val addOne = (x:Int) => x+1這樣的函數是類型爲FunctionN(在這種情況下爲Function1)的對象,其方法爲apply

人們可以使用的方法在階函數 - 編譯器可以從方法創建一個函數,例如:

scala> List(1, 2, 3).map((1).+) // or just `1+` 
res0: List[Int] = List(2, 3, 4) 

在這種情況下方法對象1+用作功能x => (1).+(x)

scala> List(1, 2, 3).foreach(println) 
1 
2 
3 

Method對象Predefprintln用作功能s => Predef.println(s)

由於2.10版本中,你不能在方法使用:type

scala> def addOne(x: Int): Int = x+1 
addOne: (x: Int)Int 

scala> :type addOne 
<console>:9: error: missing arguments for method addOne; 
follow this method with `_' if you want to treat it as a partially applied function 
     addOne 
    ^
相關問題