Странный вложенный структурный тип в дженериках

Может кто-нибудь объяснить странную конструкцию структурного типа, вложенного в дженерики:

implicit def Function1Functor[R]: Functor[({type λ[α]=(R) => α})#λ] = 
  new Functor[({type λ[α]=(R) => α})#λ] ....

Этот пример взят из библиотеки Scalaz: Functor.scala

Зачем там нужна эта конструкция? Не проще было бы написать:

 implicit def Function1Functor[R,A]: Functor[R =>A]

or

 implicit def Function1Functor[R,A]: Functor[Function1[R,A]]

person Robert Zaremba    schedule 23.11.2011    source источник


Ответы (1)


Сигнатура конструктора типа Functor показывает, что он параметризован другим, унарным, конструктором типа F:

trait Functor[F[_]] extends InvariantFunctor[F]

Ни R => A, ни Function1[R,A] не являются конструкторами типов; они не принимают никаких параметров.

Однако в:

type λ[α] = (R) => α

λ — это конструктор типа, принимающий один параметр, α. (R уже определено в этом контексте.)

Синтаксис ({type λ[α]=(R) => α})#λ известен как лямбда-тип. Это синтаксический трюк, позволяющий создать псевдоним типа внутри строки и ссылаться на него через проекцию, поэтому все выражение можно использовать там, где требуется тип.

person Ben James    schedule 23.11.2011