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

scala – 为什么这种带有类型投影的循环引用是非法的?

发布时间:2020-12-16 09:18:34 所属栏目:安全 来源:网络整理
导读:以下伪 Scala产生“非法循环引用”错误: trait GenT[A]trait T extends GenT[T#A] { type A} 问题:为什么这是非法的?是否有健全性的根本问题,还是Scala类型系统的局限性?有没有解决? 我的意图是创建一个具有类型成员A的特征T,可以通过超级特征GenT [A]
以下伪 Scala产生“非法循环引用”错误:

trait GenT[A]
trait T extends GenT[T#A] {
  type A
}

问题:为什么这是非法的?是否有健全性的根本问题,还是Scala类型系统的局限性?有没有解决?

我的意图是创建一个具有类型成员A的特征T,可以通过超级特征GenT [A]按需提升到类型参数.例如,一个应用程序可能是约束的表达

def foo[A,S1 <: GenT[A],S2 <: GenT[A]] ...

这可以被使用,就好像它是具有S1#A == S2#A的约束的def foo [S1 <:T,S2 How to specialize on a type projection in Scala? >>

注意:我可以在任何地方使用GenT而不是T,但是我试图避免这种情况,因为它会导致大量的类型参数传播到所有我的代码“传染性”.

下面的两个问题看起来是相似的,但是关于不同类型的循环引用:

> Scala: working around the “illegal cyclic reference”
> How to define a cyclic type definition?

解决方法

在您的初始示例中,您可以通过在GenT [A]和T之间引入辅助类型来打破周期,

trait GenT[A]
trait TAux { type A }
trait T extends TAux with GenT[TAux#A]

但是,从你激励的例子来看,我不认为你需要走这条路.您所遵循的约束可以直接使用细化来表达,

trait T { type A }
def foo[A0,S1 <: T { type A = A0 },S2 <: T { type A = A0 }] ...

还要记住,您可以通过类型别名将类型成员作为类型参数来表示,

trait T { type A }
type TParam[A0] = T { type A = A0 }
def foo[A0,S1 <: TParam[A0],S2 <: TParam[A0]] ...

(编辑:李大同)

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

    推荐文章
      热点阅读