【发布时间】:2019-06-06 15:19:15
【问题描述】:
在试验路径依赖类型时,我遇到了一些意想不到的结果:
object Funny1 {
class X {
type Y = String
val y: Y = "y"
}
val x1 = new X
val x2 = new X
def foo(x: X)(y: x.Y): Unit = ()
def foo_diff(y1: x1.Y)(y2: x2.Y): Unit = () // 1.3
def foo_gen(y1: X#Y)(y2: X#Y) : Unit = ()
foo(x1)(x1.y)
foo(x1)(x2.y) // <-- 1.1 would expect this to fail
foo_diff(x1.y)(x2.y)
foo_diff(x2.y)(x2.y) // <-- 1.2 would expect this to fail
foo_gen(x1.y)(x2.y)
foo_gen(x2.y)(x2.y)
}
object Funny2 {
class X {
class Y {
}
}
val x1 = new X
val x2 = new X
val x1y = new x1.Y
val x2y = new x2.Y
def foo(x: X)(y: x.Y): Unit = ()
def foo_diff(y1: x1.Y)(y2: x2.Y): Unit = ()
def foo_gen(y1: X#Y)(y2: X#Y) : Unit = ()
foo(x1)(x1y)
// foo(x1)(x2y) // does not compile
foo_diff(x1y)(x2y)
// foo_diff(x2y)(x2y) // does not compile
foo_gen(x1y)(x2y)
foo_gen(x2y)(x2y)
}
object Funny3 {
trait X {
type Y
def y: Y
}
val x1 = new X {
override type Y = String
override def y: String = "y"
}
val x2 = new X {
override type Y = Int
override def y: Int = 3
}
def foo(x: X)(y: x.Y): Unit = ()
def foo_diff(y1: x1.Y)(y2: x2.Y): Unit = ()
def foo_gen(y1: X#Y)(y2: X#Y) : Unit = ()
foo(x1)(x1.y)
// foo(x1)(x2.y) // 3.1 fails as expected
foo_diff(x1.y)(x2.y)
// foo_diff(x2.y)(x2.y) // 3.2 fails as expected
foo_gen(x1.y)(x2.y)
foo_gen(x2.y)(x2.y)
}
object Funny3b {
trait X {
type Y
def y: Y
}
val x1 = new X {
override type Y = String
override def y: String = "y"
}
val x2 = new X {
override type Y = String
override def y: String = "y2"
}
def foo(x: X)(y: x.Y): Unit = ()
def foo_diff(y1: x1.Y)(y2: x2.Y): Unit = ()
def foo_gen(y1: X#Y)(y2: X#Y) : Unit = ()
foo(x1)(x1.y)
foo(x1)(x2.y) // 3b.1 does not fail
foo_diff(x1.y)(x2.y)
foo_diff(x2.y)(x2.y) // 3b.2 does not fail
foo_gen(x1.y)(x2.y)
foo_gen(x2.y)(x2.y)
}
特别是,我对问题的答案很感兴趣:
- 为什么标记为 1.1 和 1.2) 的行会编译?
- 为什么在 1.3
foo_diff中没有引用x作为第一个参数? - 为什么行 3.1 和 3.2 不编译,但 3b.1 和 3b.2 编译?尤其是路径依赖似乎在 3b 中“丢失”了,如果可以将底层类型解析为相同(这里:字符串)。
谢谢,马丁
【问题讨论】:
标签: scala types path-dependent-type