¿Por qué necesitamos especificar un tipo refinado (o su Aux equivalente) para la salida de ciertos cálculos de tipo?

Enhttps://jto.github.io/articles/typelevel_quicksort :

Estamos expuestos a unSum tipo cuyoapply Se ve como esto:

def apply[A <: Nat, B <: Nat](implicit sum: Sum[A, B]): Aux[A, B, sum.Out] = sum

Ahora, podríamos usar el refinamiento de tipo directamente en lugar de Aux, pero la pregunta sigue siendo: ¿por qué es necesario este (el tipo de retorno explícito)? ¿No sería "obvio" que el tipo de retorno deapply tendría un tipo Sum # Out igual a sum.

Si lo eliminamos y solo usamosval x = Sum[_0, _1], se ve bien, excepto agregarval y = Sum[x.Out, _1] no funcionará, diciendo que el compilador no pudo encontrar la suma implícita.

¿Cómo es que el compilador parece "olvidar" el tipo exacto de x.Out?

Respuestas a la pregunta(1)

Su respuesta a la pregunta