Por que a técnica Aux é necessária para cálculos no nível de tipo?
Tenho certeza de que estou perdendo alguma coisa aqui, já que sou bastante novo no Shapeless e estou aprendendo, mas quando é a técnica Aux, na verdaderequeridos? Vejo que é usado para expor umtype
declaração, elevando-a para a assinatura de outro "companheiro"type
definição.
trait F[A] { type R; def value: R }
object F { type Aux[A,RR] = F[A] { type R = RR } }
mas isso não é quase equivalente a apenas colocar R na assinatura de tipo de 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
Vejo que o tipo dependente de caminho traria benefíciosE se alguém poderia usá-los em listas de argumentos, mas sabemos que não podemos fazer
def g[T](t:T)(implicit f: F[T], r: Blah[f.R]) ...
portanto, ainda somos forçados a colocar um parâmetro de tipo adicional na assinatura deg
. Usando oAux
técnica, nós somosAlém disso necessário gastar mais tempo escrevendo o companheiroobject
. Do ponto de vista do uso, pareceria para um usuário ingênuo como eu que não há benefício em usar tipos dependentes de caminho.
Há apenas um caso em que posso pensar, ou seja, para uma determinada computação em nível de tipo, mais de um resultado em nível de tipo é retornado, e você pode querer usar apenas um deles.
Eu acho que tudo se resume a mim com vista para algo no meu exemplo simples.