加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么这个部分应用程序不能编译?

发布时间:2020-12-16 18:58:19 所属栏目:安全 来源:网络整理
导读:下列: val add = (a: Int,b: Int) = a + b 转换为: object add extends Function2[Int,Int,Int] { def apply(a: Int,b: Int) = a + b} 而 val a1 = add(_: Int,3) 转换为: object a1 extends Function1[Int,Int] { def apply(x: Int): Int = { add(x,3) }
下列:

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

转换为:

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

val a1 = add(_: Int,3)

转换为:

object a1 extends Function1[Int,Int] {
  def apply(x: Int): Int = {
    add(x,3)
  }
}

但当我这样做时:

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

然后调用a2,它会抛出一个错误:

scala> a2(1,2) 
<console>:11: error: too many arguments for method apply: ()(Int,Int) => Int in trait Function0
              a2(1,2)
                ^

为什么是这样?为什么以下工作?

a2()(1,2)

解决方法

add已经是Function2 [Int,Int].如果你想让a2具有相同的类型,那么简单的赋值就足够了.

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

scala> a2(1,2)
res3: Int = 3

您正在考虑的是将方法扩展为函数.如果我们有:

def add(a: Int,b: Int): Int = a + b

然后,我们将使用add _来获取eta-expansion以赋值.

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

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

但是add已经是一个函数,所以下划线有不同的含义. add现在是一个值,而不是一个方法.由于add是一个值,它就像一个返回Function2 [Int,Int]的无参数方法.如果我们尝试进行eta扩展,我们得到()=> Function2 [Int,Int].

考虑一个更简单的例子,其中我们有一个简单的val a = 1.a基本上与返回1(def a = 1)的无参数方法相同.如果我试图获得eta扩展,我会得到()=>诠释.

scala> val a = 1
a: Int = 1

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读