que podría estar interesado en el tipo de lambdas La aplicación parcial que utilizó en su respuesta es en realidad implemented in scalaz Sin embargo, como el código tiende a ser menos legible, empezaron a usar el tipo lambdas. El tipo en cuestión podría escribirse como
({type λ[α] = CList[α,A]})#λ
Esto funciona creando una proyección de tipo en un tipo parametrizado λ
dentro de un tipo estructural, capturando así el parámetro de tipo externo (en este caso A
).
El otro problema relacionado con la varianza descrita en su respuesta podría resolverse haciendo que el parámetro Res
en Access
sea covariante.
Después de estos cambios el código debería tener este aspecto:
trait Access[+Res[_]] { def access[C] : Res[C]}
trait CList[C, +A] extends Access[({type λ[α] = CList[α,A]})#λ]
Gracias, que se ve un poco mejor. También dado que en mi caso real los parámetros de tipo de CList tenían límites superiores, tener un rasgo dedicado Partial2 no era realmente útil (necesitaría agregar parámetros de tipos para los límites, etc.) –
También si el tipo lambdas se usa con frecuencia en su código, considere el siguiente complemento del compilador: https://github.com/non/kind-projector –