2

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?

Dmytro Mitin
  • 48,194
  • 3
  • 28
  • 66
user2039784
  • 199
  • 9

1 Answers1

4

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]]})#λ]
ZhekaKozlov
  • 36,558
  • 20
  • 126
  • 155
  • Thank you, now I see. Unfortunatelly, I seem to be stuck with Intellij. I have found that plugin is declared as suggested (https://github.com/non/kind-projector) in Build.scala in Project folder of Scalaz.However, this is not eventually reflected in the IDE. Do you happen to have any experience with setting the compiler plugin in Intellij? – user2039784 Apr 08 '15 at 21:15
  • That basically means that one cannot play/develop Scalaz in Intellij Idea. Then, what other ide/editor one can use? – user2039784 Apr 09 '15 at 17:35