Warum ist die Aux-Technik für Berechnungen auf Typebene erforderlich?

Ich bin mir ziemlich sicher, dass ich hier etwas vermisse, da ich für Shapeless ziemlich neu bin und lerne, aber wann ist eigentlich die Aux-Technik?erforderlic? Ich sehe, dass es verwendet wird, um ein @ auszusetztype Anweisung, indem Sie es in die Signatur eines anderen "Begleiters" erhebentype definition.

trait F[A] { type R; def value: R }
object F { type Aux[A,RR] = F[A] { type R = RR } }

aber ist das nicht fast gleichbedeutend mit dem Einfügen von R in die Typensignatur von 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

Ich sehe, dass pfadabhängiger Typ Vorteile bringen würdewen man könnte sie in Argumentlisten verwenden, aber wir wissen, dass wir das nicht können

def g[T](t:T)(implicit f: F[T], r: Blah[f.R]) ...

daher sind wir immer noch gezwungen, einen zusätzlichen Typparameter in die Signatur von @ einzufügg. Mit demAux Technik, wir sindebenfall erforderlich, um zusätzliche Zeit mit dem Schreiben des Begleiters zu verbringenobject. Vom Standpunkt der Verwendung aus würde es einem naiven Benutzer wie mir erscheinen, dass die Verwendung von pfadabhängigen Typen überhaupt keinen Nutzen bringt.

Es gibt nur einen Fall, den ich mir vorstellen kann, dh, für eine bestimmte Berechnung auf Typebene wird mehr als ein Ergebnis auf Typebene zurückgegeben, und Sie möchten möglicherweise nur einen davon verwenden.

Ich denke, es läuft alles darauf hinaus, dass ich in meinem einfachen Beispiel etwas übersehen habe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage