什么是投影仪

What is a kind projector

我一直在深入研究 FP 和它周围的一切,我发现某处写了 kind projector 的概念,没有详细信息也没有解释。

我唯一找到的是这个 github project,我开始思考它是指这个特定项目,还是指 FP 中的某个通用概念?

那么,什么是投影仪呢?为什么有用? (如果可能,您能否提供示例、资源等?)

对于您链接到的 Scala 编译器的特定插件,这确实只是一个有点尴尬的名称。我认为它本身没有任何意义,但它有点符合它的目的。

该插件的作用是为 Scala 通常针对 lambda 类型的解决方法提供一种替代语法,它使用一种称为 type projections 的语言功能。

假设您想为 Either 实施 Functor。现在,Functor 需要种类 * -> *,而 Either 需要种类 * -> * -> *。所以我们需要先固定第一个参数,然后才能为部分应用的类型构造函数提供实现。在 "regular" Scala 中,您可以这样做的唯一方法是:

implicit def eitherIsFunctor[A]: Functor[{type λ[X] = Either[A, X]}#λ] = { ... }

其中{type λ[X] = Either[A, X]}是一个匿名结构类型,它只是立即用于"project out"λ,我们真正想要的类型。在 Haskell 中,您可以说

instance Functor (Either a) where ...

其中 Either 被部分应用(并且 a 被自动量化)。

该插件允许将投影替换为看起来更像 Scala 中常见的部分应用程序的东西,即 Either[A, ?],而不是难以理解的 {type λ[X] = Either[A, X]}#λ(并且还提供了通用类型的 lambdas ,我认为,总是通过将它们转换为匿名类型和投影)。

Scala 3 提供原生 type lambdas 不再基于类型投影

A type lambda such as [X] =>> F[X] defines a function from types to types.

例如,

trait Functor[F[_]]

new Functor[Either[String, Int]] {}                   // error
new Functor[({ type λ[X] = Either[String, X] })#λ] {} // Scala 2 type lambda based on type projection
new Functor[λ[X => Either[String, X]]] {}             // kind projector type lambda
new Functor[Either[String, *]] {}                     // kind projector type lambda
new Functor[[X] =>> Either[String, X]] {}             // Scala 3 type lambda         

此外,还有一项提案 SIP: Underscore Syntax for Type Lambdas #5379

Functor[Either[String, _]] // equivalent to Functor[[X] =>> Either[String, X]]