什么是一台投影机

时间:2016-10-06 20:42:12

标签: scala functional-programming lambda-calculus higher-kinded-types kind-projector

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

我发现的唯一的事情就是这个github project,我开始思考它是指这个特定项目,还是FP中的一些通用概念?

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

2 个答案:

答案 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 ...

部分应用了Eithera会自动量化)。

该插件允许用一个看起来更像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]]
相关问题