Я уверен, что здесь что-то не хватает, так как я довольно новичок в Shapeless, и я учусь, но когда на самом деле существует метод Aux ? Я вижу, что он используется, чтобы выставить оператор type
, подняв его в подпись другого определения "компаньон" type
.
trait F[A] { type R; def value: R }
object F { type Aux[A,RR] = F[A] { type R = RR } }
но это не эквивалентно простому помещению R в сигнатуру типа F?
trait F[A,R] { def value: R }
implicit def fint = new F[Int,Long] { val value = 1L }
implicit def ffloat = new F[Float,Double] { val value = 2.0D }
def f[T,R](t:T)(implicit f: F[T,R]): R = f.value
f(100) // res4: Long = 1L
f(100.0f) // res5: Double = 2.0
Я вижу, что зависящий от типа тип принесет пользу, если можно использовать их в списках аргументов, но мы знаем, что мы не можем делать
def g[T](t:T)(implicit f: F[T], r: Blah[f.R]) ...
таким образом, мы по-прежнему вынуждены вводить дополнительный параметр типа в подпись g
. Используя технику Aux
, мы также должны потратить дополнительное время на запись компаньона object
. С точки зрения использования, это будет выглядеть для наивного пользователя, такого как я, что нет никакой пользы в использовании зависимых от пути типов вообще.
Есть только один случай, о котором я могу думать, т.е. при заданном вычислении на уровне типа возвращается более одного результата на уровне типа, и вы можете использовать только один из них.
Я думаю, все это сводится к тому, что я пропустил что-то в моем простом примере.