5

我一直在深入研究 FP 和它周围的一切,我发现在某处写有实物投影仪的概念,没有细节也没有解释。

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

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

4

2 回答 2

15

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

该插件的作用是为 Scala 的类型 lambdas 的常用解决方法提供一种替代语法,它使用一种称为类型投影的语言功能。

假设你想实现Functorfor Either。现在,Functor需要 kind * -> *,而Eitherhas 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,我认为,总是通过将它们转换为匿名类型和投影) .

于 2016-10-07T14:53:16.013 回答
3

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]]
于 2020-04-05T12:04:32.350 回答