scala types currying higher-kinded-types

¿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] }