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

scala – 不推断多个参数关闭参数类型

发布时间:2020-12-16 21:33:40 所属栏目:安全 来源:网络整理
导读:我有一段代码,我不能以我想要的方式行事.我有一个类定义如下(剥离为此): class Behaviour[T](private val rule: Time = T) { def map1[U,V](behaviour: Behaviour[U],func: (T,U) = V): Behaviour[V] = { new Behaviour(time = func(this.at(time),behaviou
我有一段代码,我不能以我想要的方式行事.我有一个类定义如下(剥离为此):

class Behaviour[T](private val rule: Time => T) {
  def map1[U,V](behaviour: Behaviour[U],func: (T,U) => V): Behaviour[V] = {
    new Behaviour(time => func(this.at(time),behaviour.at(time)))
  }
}

当玩这个课时,我尝试了一些我认为是微不足道的事情:

val beh = Behaviour(time => 5)
val beh2 = Behaviour(time => 5)
beh.map1(beh2,(a,b) => a + b)

对于最后一行我收到以下错误:

<console>:13: error: missing parameter type
          beh.map1(beh2,b) => a + b)
                             ^

我当然可以指定闭包参数类型,它可以正常工作,但为什么不在这里输入推理?当然我也可以指定函数的通用类型(对于这两个解决方案,请参见下文).

我认为Scala进行了一个“扫描”来推断类型,并且会看到beh2并传递给该函数,并将这里假定为Int.有没有一些方法可以解决这个问题,而没有指定输入参数的类型(对于闭包或泛型)?

编辑:我有两个修复的例子:

beh.map1[Int,Int](beh2,b) => a + b)
beh.map1(beh2,b : Int) => a + b)

解决方法

请参阅 this scala-debate thread讨论这里发生了什么.问题是Scala的类型推断发生在每个参数列表中,而不是每个参数.

正如Josh Suereth在这一点上所说的那样,现在有一个很好的理由.如果Scala具有每参数类型推断,则编译器无法在同一参数列表中推断跨类型的上限.考虑以下几点:

trait X
class Y extends X
class Z extends X

val y = new Y
val z = new Z

def f[A](a: A,b: A): (A,A) = (a,b)
def g[A](a: A)(b: A): (A,b)

f(y,z)的工作原理与我们预期的一样,但是g(y)(z)给出了类型不匹配,因为在编译器到达第二个参数列表时,它已经被选择为Y作为A的类型.

(编辑:李大同)

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

    推荐文章
      热点阅读