我一直在深入研究 FP 和它周围的一切,我发现在某处写有实物投影仪的概念,没有细节也没有解释。
我唯一找到的是这个github 项目,我开始思考它是指这个特定的项目,还是指 FP 中的一些通用概念?
那么,什么是实物投影仪?为什么有用?(如果可能,您能否提供示例、资源等?)
我一直在深入研究 FP 和它周围的一切,我发现在某处写有实物投影仪的概念,没有细节也没有解释。
我唯一找到的是这个github 项目,我开始思考它是指这个特定的项目,还是指 FP 中的一些通用概念?
那么,什么是实物投影仪?为什么有用?(如果可能,您能否提供示例、资源等?)
对于您链接到的 Scala 编译器的特定插件,这确实只是一个有点尴尬的名称。我不认为它对自己有任何意义,但它有点符合它的目的。
该插件的作用是为 Scala 的类型 lambdas 的常用解决方法提供一种替代语法,它使用一种称为类型投影的语言功能。
假设你想实现Functor
for Either
。现在,Functor
需要 kind * -> *
,而Either
has kind * -> * -> *
。所以我们需要先修复第一个参数,然后才能提供部分应用类型构造函数的实现。您可以在“常规”Scala 中执行此操作的唯一方法是:
implicit def eitherIsFunctor[A]: Functor[{type λ[X] = Either[A, X]}#λ] = { ... }
where{type λ[X] = Either[A, X]}
是一个匿名结构类型,它只立即用于“投影” λ
,即我们真正想要的类型。在 Haskell 中,你可以说
instance Functor (Either a) where ...
其中Either
部分应用(并a
自动量化)。
该插件允许将投影替换为看起来更像 Scala 中通常的部分应用程序的东西,即Either[A, ?]
,而不是难以理解的{type λ[X] = Either[A, X]}#λ
(并且还提供了通用类型 lambda,我认为,总是通过将它们转换为匿名类型和投影) .
Scala 3 提供了不再基于类型投影的原生类型 lambda
类型 lambda 例如
[X] =>> F[X]
定义了从类型到类型的函数。
例如,
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]]