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

scala – 返回路径依赖类型

发布时间:2020-12-16 10:01:50 所属栏目:安全 来源:网络整理
导读:如何设计返回路径依赖类型的方法?在下面的例子中,我故意希望Vertex是依赖于Tree的路径,这样就禁止在树之间混合顶点(这只是一个例子): trait Tree { trait Vertex def root: Vertex def addChild(parent: Vertex): Vertex}trait TreeFactory { def make: Tr
如何设计返回路径依赖类型的方法?在下面的例子中,我故意希望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
}

这失败的另一个原因是:“错误:非法依赖方法类型”

解决方法

我扭曲的想法想出了这个.我希望有一个更优雅的解决方案:

trait Gagaism {
  val tree: Tree
  val map: Map[tree.Vertex,tree.Vertex]
}

def test(f: TreeFactory) = new Gagaism {
  val tree = f.make
  val map = {
    var sq = IndexedSeq(tree.root)
    var m = Map.empty[tree.Vertex,tree.Vertex]
    for (i <- 1 to 100) {
      val p = sq(util.Random.nextInt(sq.size))
      val c = tree.addChild(p)
      m    += c -> p
      sq  :+= c
    }
    m
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读