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

为什么scala编译器不会使用抽象类型推断类型

发布时间:2020-12-16 08:44:01 所属栏目:安全 来源:网络整理
导读:给出以下代码 trait A { type B }case class C extends A { type B = String }def f[V : A](b: V#B = V) = b 这个编译 f[C](a = new C()) 但为什么这个不编译? f(a = new C()) 解决方法 如果它在一个参数列表中推断出类型,则该约束将在右侧的后续参数列表中
给出以下代码

trait A { type B }
case class C extends A { type B = String }
def f[V <: A](b: V#B => V) = b

这个编译

f[C](a => new C())

但为什么这个不编译?

f(a => new C())

解决方法

如果它在一个参数列表中推断出类型,则该约束将在右侧的后续参数列表中使用. (在SO上看到很多类似的问题.)

但是在参数列表中不会发生这种情况.

这也不起作用:

scala> def g[V <: A](b: V => V#B) = b
g: [V <: A](b: V => V#B)V => V#B

scala> g((c: C) => "")
<console>:11: error: type mismatch;
 found   : String("")
 required: ?#B

的?意味着它没有固定V,即使它刚刚解决了V.

对比:

scala> def k[V <: A](v: V)(f: V#B => V) = 42
k: [V <: A](v: V)(f: V#B => V)Int

scala> k(new C)(_ => new C)
res5: Int = 42

当前使用的选项是-Ytyper-debug.有时人们可以理解输出.

对于你的例子f(_ => new C),你可以看到它立即在x $1上失败,即使有人希望它回溯并纠正自己.

|    |    |    |    |-- ((x$1) => new C()) : pt=?#B => ? BYVALmode-EXPRmode-POLYmode (site: value res0  in $iw) 
<console>:11: error: missing parameter type
              f(_ => new C)
                ^
|    |    |    |    |    |-- new C() EXPRmode (site: value $anonfun in $iw) 
|    |    |    |    |    |    |-- new C BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value $anonfun in $iw) 
|    |    |    |    |    |    |    |-- new C EXPRmode-POLYmode-QUALmode (silent: value $anonfun in $iw) 
|    |    |    |    |    |    |    |    |-- C FUNmode-TYPEmode (silent: value $anonfun in $iw) 
|    |    |    |    |    |    |    |    |    -> C
|    |    |    |    |    |    |    |    -> C
|    |    |    |    |    |    |    -> ()C
|    |    |    |    |    |    -> C
|    |    |    |    |    -> <error> => C
|    |    |    |    solving for (V: ?V)
|    |    |    |    -> C#B => C

还有

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#local-type-inference

(编辑:李大同)

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

    推荐文章
      热点阅读