【发布时间】:2019-02-17 15:25:28
【问题描述】:
我在使用路径相关类型时遇到了一些问题。
我有一些类型Foo 带有一个抽象类型成员F。 Bar 等实例将提供具体类型。
然后有一个类型类Baz。对于Foo#F 的每种具体类型,我都有类型类的实例(但Foo 本身没有)。
这是一个例子:
sealed trait Foo {
type F
}
object Bar extends Foo {
type F = Array[Byte]
}
trait Baz[B] {
def b(b: B): String
}
object Baz {
implicit val bazByteArray: Baz[Array[Byte]] = (b: Array[Byte]) => new String(b)
}
我无法编译:
def f(a: Foo): Baz[a.F] = {
val baz = a match {
case bar@Bar => g(bar)
}
baz
} // Expression of type Baz[(a.type with Bar.type)#F] doesn't conform to Baz[a.F]
val x2: Foo = Bar
val y2: Baz[x2.F] = f(x2) // Expression of type Baz[Foo#F] doesn't conform to expected type Baz[x2.F]
这确实编译:
def g(a: Foo)(implicit baz: Baz[a.F]): Baz[a.F] = {
baz
}
val x1: Bar.type = Bar
val y1: Baz[x1.F] = f(x1)
为什么g 编译但f 不编译?类型不一样吗?
如何让f 编译?有什么我需要补充的证据吗?
【问题讨论】:
标签: scala types typeclass path-dependent-type