假设我有一个带有两个类型参数的特征,例如
trait Qux[A, B]
和另一个具有更高类型参数的特征,例如
trait Turkle[C[_]]
我希望能够将一个固定值替换为 的类型参数之一Qux
,以便它可以用于参数化Turkle
。
这是一个示例(在 Scala 中没有意义的代码!):
trait Baz[A] extends Turkle[Qux[A, _]]
任何人有任何想法如何实现这种效果?
假设我有一个带有两个类型参数的特征,例如
trait Qux[A, B]
和另一个具有更高类型参数的特征,例如
trait Turkle[C[_]]
我希望能够将一个固定值替换为 的类型参数之一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]
}
编译器插件类型的投影仪也允许这样做:
// 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,?]]
Scala 3 提议SIP: Underscore Syntax for Type Lambdas #5379以便以下可能成为可能
trait Baz[A] extends Turkle[Qux[A, _]]
Scala 3 本机使用语法提供类型 lambda ,所以请尝试[X] =>> F[X]
trait Baz[A] extends Turkle[[B] =>> Qux[A, B]]