为什么具有类型投影的循环引用是非法的



以下伪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]] ...

这可以被当作是具有约束CCD_ 5的CCD_。

如果这项技术是可行的,它可能也有助于解决以下问题:如何在Scala中专门处理类型投影?

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

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

  • Scala:围绕";非法循环引用">
  • 如何定义循环类型定义

在您的初始示例中,您可以通过在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]] ...

最新更新