在scala中,如果case类是在家族外部类型中声明的,如何调用它的泛化复制函数第2部分

7rfyedvj  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(310)

**赏金5天后到期。回答此问题可获得+150声望奖励。tribbloid正在寻找一个可靠来源的答案。

这是第1部分的后续问题:
在scala中,如果case类是在家族外部类型中声明的,如何调用它的泛化copy函数?
在第2部分中,族类的定义变得稍微复杂一些:

trait OuterSpike {

  class Thing

  case class Inner(v: Thing) {

    //    val outer = self
  }
}

object OuterSpike {

  {

    def cp(src: OuterSpike#Inner): OuterSpike#Inner = {
      src.copy()
    }

    def cp2[O <: OuterSpike](src: O#Inner): O#Inner = src.copy()

    val outer = new OuterSpike {
      val inner = this.Inner(new Thing)
    }
    cp(outer.inner)
  }
}

因此,旧的技巧不再有效,上面编译时出现以下错误:

[Error] /home/peng/git/shapesafe/graph-commons/src/main/scala/com/tribbloids/graph/commons/util/reflect/format/OuterSpike.scala:18: type mismatch;
 found   : com.tribbloids.graph.commons.util.reflect.format.OuterSpike#Thing
 required: _1.Thing where val _1: com.tribbloids.graph.commons.util.reflect.format.OuterSpike
[Error] /home/peng/git/shapesafe/graph-commons/src/main/scala/com/tribbloids/graph/commons/util/reflect/format/OuterSpike.scala:21: type mismatch;
 found   : O#Thing
 required: _1.Thing where val _1: O
two errors found

在这种情况下如何使其编译?

kokeuurv

kokeuurv1#

看来你在精炼 OuterSpikeval inner 这取决于 outer 示例

val outer = new OuterSpike {
  val inner = this.Inner(new Thing)
}

所以尝试使用依赖类型而不是类型投影

def cp(outer: OuterSpike)(src: outer.Inner): outer.Inner = {
  src.copy()
}
cp(outer)(outer.inner)
mspsb9vt

mspsb9vt2#

定义无参数 cpInner 也许?

trait OuterSpike { 
  class Thing
  case class Inner(v: Thing) {
     def cp() = copy()
  }
}

object OuterSpike {
    def cp[O <: OuterSpike](src: O#Inner) = src.cp()
    val outer = new OuterSpike {
      val inner = this.Inner(new Thing)
    }
    cp(outer.inner)
}

或者,您可以放宽 Inner 一点点:

case class Inner(v: OuterSpike#Thing)

如果你这样定义,那么 def cp[O <: OuterSpike](src: O#Inner) = src.copy() 作品。

相关问题