¿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?