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