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>