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的类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |