Странный вложенный структурный тип в дженериках - PullRequest
3 голосов
/ 23 ноября 2011

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

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

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

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

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

или

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

1 Ответ

7 голосов
/ 23 ноября 2011

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

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

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

Однако в:

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

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

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

...