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

Есть только один случай, о котором я могу подумать: для данного вычисления уровня типа возвращается более одного результата уровня типа, и вы можете захотеть использовать только один из них.

Я думаю, все сводится к тому, что я что-то упускаю из своего простого примера.

Ответы на вопрос(1)

Ваш ответ на вопрос