Function 为什么命名函数的类型不同于scala中的匿名函数

Function 为什么命名函数的类型不同于scala中的匿名函数,function,scala,anonymous,Function,Scala,Anonymous,在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 scal

在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
scala>valaddone=(x:Int)=>x+1
addOne:Int=>Int=
scala>:键入addOne
Int=>Int
为什么他们的类型看起来不同

为什么命名函数不能作为参数传递给另一个函数

不应该从类型和一阶行为的角度统一对待这两者吗?

def addOne(x:Int):Int
不是scala中的函数。这是某个对象的一种方法

val addOne=(x:Int)=>x+1
这样的函数是
FunctionN
类型的对象(在本例中为
Function1
),方法为
apply

可以在scala中将方法用作函数-编译器可以从方法创建函数,例如:

scala> List(1, 2, 3).map((1).+) // or just `1+`
res0: List[Int] = List(2, 3, 4)
在这种情况下,对象
1
的方法
+
用作函数
x=>(1)。+(x)

对象
Predef
的方法
println
用作函数
s=>Predef.println

由于版本
2.10
您不能在方法上使用
:键入

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
       ^
scala>defaddone(x:Int):Int=x+1
地址:(x:Int)Int
scala>:键入addOne
:9:错误:方法addOne缺少参数;
如果要将其视为部分应用的函数,请使用“\u1”遵循此方法
阿登
^
def addOne(x:Int):Int
不是scala中的函数。这是某个对象的一种方法

val addOne=(x:Int)=>x+1
这样的函数是
FunctionN
类型的对象(在本例中为
Function1
),方法为
apply

可以在scala中将方法用作函数-编译器可以从方法创建函数,例如:

scala> List(1, 2, 3).map((1).+) // or just `1+`
res0: List[Int] = List(2, 3, 4)
在这种情况下,对象
1
的方法
+
用作函数
x=>(1)。+(x)

对象
Predef
的方法
println
用作函数
s=>Predef.println

由于版本
2.10
您不能在方法上使用
:键入

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
       ^
scala>defaddone(x:Int):Int=x+1
地址:(x:Int)Int
scala>:键入addOne
:9:错误:方法addOne缺少参数;
如果要将其视为部分应用的函数,请使用“\u1”遵循此方法
阿登
^