Найти неявное значение по члену абстрактного типа

С таким типом, как trait A[T], найти неявное в области видимости просто implicitly[A[SomeType]]

Можно ли это сделать, и если да, то как это сделать, если параметр типа заменяется членом абстрактного типа, как в trait A { type T }?


person megri    schedule 20.08.2014    source источник


Ответы (2)


Ты можешь сделать

implicitly[A { type T = Int }

но вы рискуете потерять точность:

scala> trait Foo { type T ; val t: T }
defined trait Foo

scala> implicit val intFoo: Foo { type T = Int } = new Foo { type T = Int ; val t = 23 }
intFoo: Foo{type T = Int} = $anon$1@6067b682

scala> implicitly[Foo].t // implicitly loses precision
res0: Foo#T = 23

Чтобы решить эту проблему, вы можете использовать новый метод the из библиотеки shapeless (из которой Я взял пример выше)

scala> the[Foo].t // the retains it
res1: Int = 23

scala> the[Foo].t+13
res2: Int = 36
person Gabriele Petronella    schedule 20.08.2014
comment
the великолепен, но implicitly[Foo { type T = Int }] выполняет то же самое и более прямо соответствует случаю параметра типа. - person Travis Brown; 21.08.2014
comment
да, это, наверное, перебор, но я просто хотел указать на риск и предложить альтернативу :) - person Gabriele Petronella; 21.08.2014

Я только что понял, что это можно сделать с помощью implicitly[A { type T = SomeType }]

person megri    schedule 20.08.2014