【发布时间】:2015-07-07 23:59:16
【问题描述】:
我在写表单的函数
def test[A,B](a: A, b: B)(implicit eq: A =:= B): Unit = ...
我需要证明A 和B 类型相同的证据。
我希望test(a,a) 形式的调用可以编译为任何a,但当a 的类型涉及存在时,情况似乎并非如此,例如
case class Foo[T](c: T)
val l = List(Foo(1), Foo(1.0F), Foo(0.0)) // Inferred type: List[Foo[_ >: Double with Float with Int <: AnyVal]]
test(l.head, l.head) // Does not compile, error like: Cannot prove that Foo[_7] =:= Foo[_7].
所以我的问题是:我是否误用了=:=?或者它可能是一个错误?还是存在主义的基本限制?还是它们的实施有限制?
上下文
我正在测试涉及依赖类型的函数f 的返回类型。
我希望它在val a = f(...); val b = f(...) 中为a 和b 返回相同的类型,因此我调用test(a, b)。如果a 和b 的类型涉及existentials,即使test(a,a) 和test(b,b) 也不会编译,如上所述。
【问题讨论】: