Scalaz Functor typeclass special symbols

2019-02-19 22:52发布

问题:

Recently I have come across this Scalaz code (e.g. https://github.com/scalaz/scalaz/blob/series/7.2.x/core/src/main/scala/scalaz/Functor.scala):

def compose[G[_]](implicit G0: Functor[G]): Functor[λ[α => F[G[α]]]] =
    new CompositionFunctor[F, G] {
      implicit def F = self
      implicit def G = G0
    }

What is the meaning/purpose of the type expression inside the "Functor", i.e. λ[α => F[G[α]]]? Sofar, I have seen just type aliases like e.g. in http://like-a-boss.net/2014/09/27/type-lambda-in-scala.html

new Functor[A, ({ type Alias[A] = Tuple2[X, A]})#Alias]

Also, Intellij Idea (14.0.3) cannot resolve the symbol. Scalaz built by sbt outside Intellij and then imported into Intellij. Any idea what can be the case?

回答1:

This syntax is enabled by the kind-projector Scala plugin. It allows to write type lambdas in more concise way:

Functor[λ[α => F[G[α]]]]

Without the plugin it would look like:

Functor[({type λ[x] = G[F[x]]})#λ]