я застрял на как час, чтобы обнаружить этот факт:Невозможно разрешить класс доказательств зависит путь типа ж/о, имеющий тип значения доступной
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 не находит implicits в типе, у которого нет типа значения, доступного на любом префиксе. На него нельзя ссылаться. Очевидно, Scalac должен получить доступ к этому Foo.this.foo
, чтобы разрешить имплициты в нем, чего в этом случае он не может.
Я чувствую, что если вы комбинируете классы типов и типы, зависящие от пути, вы эффективно обречены. В конечном итоге вы столкнетесь с такими вещами. Я сделал это, потому что scalac не мог бы вызывать типы в моих API-методах, и пользователь должен был бы объявить их явно. Таким образом, я выбрал такой дизайн, чтобы типы были построены в Foo[T]
, а методы api используют существующий тип, но я ударил несколько действительно уродливых проблем и ошибок такого типа, что сделало мое приложение похожим на overengineered дерьмо ...
, так что у моего последнего фрагмента есть неизменный идентификатор, который нестабилен, потому что он находится в области метода, так что это тоже не работает? 'def method() = {// это не скомпилируется, если оно находится в пределах области метода val foo = new Foo() foo.foo [Int] (4) } ' – lisak
Фактически последний фрагмент работает для меня - Scala REPL 2.11.2 – dk14
Я также объявил его внутри объекта (см. Обновление в своем ответе) и запускал/скомпилировал с помощью scala/scalac - и он работает – dk14