繁体   English   中英

是否可以在 Scala 中“咖喱”更高种类的类型?

[英]Is it possible to “curry” higher-kinded types in Scala?

假设我有一个带有两个类型参数的特征,例如

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 使用[X] =>> F[X]语法本机提供类型 lambda ,因此请尝试

trait Baz[A] extends Turkle[[B] =>> Qux[A, B]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM