¿Es posible "curry" los tipos de mayor nivel en Scala?
types currying (4)
Supongamos que tengo un rasgo con dos parámetros de tipo, por ejemplo
trait Qux[A, B]
y otro rasgo con un parámetro tipo de mayor grado, por ejemplo
trait Turkle[C[_]]
Me gustaría poder sustituir un valor fijo por uno de los parámetros de tipo para Qux
, de modo que pueda usarse para parametrizar Turkle
.
Aquí hay un ejemplo (¡de código que no tiene sentido en Scala!):
trait Baz[A] extends Turkle[Qux[A, _]]
Alguien tiene alguna idea de cómo lograr este efecto?
¿Quieres decir algo como esto?
trait QuxWithString[A] extends Qux[A, String]
new Turkle[QuxWithString]{}
Esta es la aplicación analógica a parcial para tipos.
A Jason Zaugg se le ocurrió la manera más concisa de hacer esto:
trait Baz[A] extends Turkle[({type x[a]=Qux[A, a]})#x]
El complemento Scala de IntelliJ opcionalmente colapsará esto para:
trait Baz[A] extends Turkle[x[a]=Qux[A, a]]
El proyector tipo compilador de complemento permite esto también:
// Explicit lambda, greek letters
trait Baz[A] extends Turkle[λ[α=>Qux[A,α]]]
// Explicit lambda, normal letters
trait Baz[A] extends Turkle[Lambda[a=>Qux[A,a]]]
// No explicit lambda, ? placeholder
trait Baz[A] extends Turkle[Qux[A,?]]
trait Turkle[C[_]]
trait Qux[A,B]
trait Wraps[A] {
type Jkz[X] = Qux[A,X]
trait Baz extends Turkle[Jkz]
}