假设我有一个具有两个类型参数的特征,例如:
trait Qux[A, B]
和具有较高类型参数的另一个特征,例如,
trait Turkle[C[_]]
我希望能够为 Qux 的一个类型参数替换一个固定值,以便它可以用于参数化 Turkle .
Qux
Turkle
这是一个示例(在Scala中没有意义的代码!):
trait Baz[A] extends Turkle[Qux[A, _]]
任何人有任何想法如何实现这种效果?
Jason Zaugg想出了最简洁的方法:
trait Baz[A] extends Turkle[({type x[a]=Qux[A, a]})#x]
IntelliJ的Scala插件可以选择将其折叠为:
trait Baz[A] extends Turkle[x[a]=Qux[A, a]]
你的意思是这样的?
trait QuxWithString[A] extends Qux[A, String] new Turkle[QuxWithString]{}
这是类型的模拟到部分应用程序 .
trait Turkle[C[_]] trait Qux[A,B] trait Wraps[A] { type Jkz[X] = Qux[A,X] trait Baz extends Turkle[Jkz] }
编译器插件kind projector也允许这样:
// 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,?]]
4 回答
Jason Zaugg想出了最简洁的方法:
IntelliJ的Scala插件可以选择将其折叠为:
你的意思是这样的?
这是类型的模拟到部分应用程序 .
编译器插件kind projector也允许这样: