【发布时间】:2014-12-21 13:24:01
【问题描述】:
我被困了差不多一个小时才发现这个事实:
class Foo {
trait TypeClass[X]
object TypeClass {
implicit val gimme = new TypeClass[Int]{}
}
def foo[X : TypeClass](p: X): Unit = println("yeah " + p)
}
// compiles
val foo = new Foo()
foo.foo(4)
//does not compile
new Foo().foo(4)
could not find implicit value for evidence parameter of type _1.TypeClass[Int]
[error] new Foo().foo(4)
[error]
我不明白为什么会这样。我能想到的唯一一件事是 scalac 在没有任何前缀可访问的值类型的类型中找不到隐含。它不能被引用。 Scalac 显然需要访问 Foo.this.foo 来解决其中的隐含问题,在这种情况下它不能。
我觉得如果你将类型类和路径依赖类型结合起来,你实际上注定要失败。你最终会处理这种事情。我这样做是因为 scalac 不会在我的 API 方法中推断类型,并且用户必须显式声明它们。所以我选择了这种设计,类型在Foo[T] 中构造,api 方法使用现有的类型,但是我遇到了几个非常丑陋的问题和错误,让我的应用看起来像一个过度设计的废话......
【问题讨论】:
标签: scala implicit scalac path-dependent-type