Scala 为什么这个部分应用程序不编译?

Scala 为什么这个部分应用程序不编译?,scala,Scala,以下是: val add = (a: Int, b: Int) => a + b 转换为: object add extends Function2[Int, Int, Int] { def apply(a: Int, b: Int) = a + b } 当 转换为: object a1 extends Function1[Int, Int] { def apply(x: Int): Int = { add(x, 3) } } 但当我这样做的时候: scala&

以下是:

val add = (a: Int, b: Int) => a + b 
转换为:

object add extends Function2[Int, Int, Int] {
  def apply(a: Int, b: Int) = a + b
}

转换为:

object a1 extends Function1[Int, Int] {
  def apply(x: Int): Int = {
    add(x, 3)
  }
}
但当我这样做的时候:

scala> val a2 = add _
a2: () => (Int, Int) => Int = <function0>
为什么会这样?为什么下面的工作

a2()(1, 2)

add
已经是一个
函数2[Int,Int,Int]
。如果希望
a2
具有相同的类型,那么简单的赋值就足够了

scala> val a2 = add
a2: (Int, Int) => Int = <function2>

scala> a2(1, 2)
res3: Int = 3
然后,我们将使用
add
获取要分配给某个值的eta扩展

scala> def a2 = add _
a2: (Int, Int) => Int

scala> a2(1, 2)
res4: Int = 3
但是
add
已经是一个函数,因此下划线有不同的含义<代码>添加现在是一个值,而不是一个方法。由于
add
是一个值,它就像一个无参数方法,返回
函数2[Int,Int,Int]
。如果我们试图得到它的eta扩展,我们得到的是
()=>函数2[Int,Int,Int]

考虑一个更简单的例子,其中我们有一个简单的
vala=1
a
基本上与返回
1
defa=1
)的无参数方法相同。如果我尝试获取eta扩展,我将获得
()=>Int

scala> val a = 1
a: Int = 1

scala> val a2 = a _
a2: () => Int = <function0>
scala>val a=1
a:Int=1
scala>val a2=a_
a2:()=>Int=
def add(a: Int, b: Int): Int = a + b
scala> def a2 = add _
a2: (Int, Int) => Int

scala> a2(1, 2)
res4: Int = 3
scala> val a = 1
a: Int = 1

scala> val a2 = a _
a2: () => Int = <function0>