Почему техника Aux требуется для вычислений на уровне типов?
Я почти уверен, что чего-то здесь не хватает, так как я довольно новичок в 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
, С точки зрения использования, для такого наивного пользователя, как я, было бы совершенно бесполезным использование зависимых от пути типов.
Есть только один случай, о котором я могу подумать: для данного вычисления уровня типа возвращается более одного результата уровня типа, и вы можете захотеть использовать только один из них.
Я думаю, все сводится к тому, что я что-то упускаю из своего простого примера.