如何设计返回路径依赖类型的方法?在下面的例子中,我特意要Vertex
是路径依赖Tree
使得它被禁止混合整个树的顶点(这只是一个例子):返回路径依赖类型
trait Tree {
trait Vertex
def root: Vertex
def addChild(parent: Vertex): Vertex
}
trait TreeFactory { def make: Tree }
现在无法构造如下:
def test(f: TreeFactory): (Tree, Map[Tree#Vertex, Tree#Vertex]) = {
val t = f.make
var sq = IndexedSeq(t.root)
var m = Map.empty[t.Vertex, t.Vertex]
for(i <- 1 to 100) {
val p = sq(util.Random.nextInt(sq.size))
val c = t.addChild(p)
m += c -> p
sq :+= c
}
(t, m)
}
因为显然地图我回应该不会有按键和Tree#Vertex
类型,但路径依赖的顶点值...
error: type mismatch;
found : scala.collection.immutable.Map[t.Vertex,t.Vertex]
required: Map[Tree#Vertex,Tree#Vertex]
Note: t.Vertex <: Tree#Vertex, but trait Map is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Tree#Vertex`. (SLS 3.2.10)
(t, m)
^
如果我尝试去耦树创建和亲子地图积聚:
def test(t: Tree): Map[t.Vertex, t.Vertex] = {
var sq = IndexedSeq(t.root)
var m = Map.empty[t.Vertex, t.Vertex]
for (i <- 1 to 100) {
val p = sq(util.Random.nextInt(sq.size))
val c = t.addChild(p)
m += c -> p
sq :+= c
}
m
}
这失败的另一个原因是:"error: illegal dependent method type"
如果你不喜欢使用-Ydependent-method-types,那么这(把依赖的值与依赖类型打包在一起)就是我所推荐的。 –
谢谢你哩,这工作。因为,正如我的想法,你不需要'-X实验',我想知道为什么必须明确地启用它? –