Понимание типовой проекции

Взято из typelevel/kind-projector, в чем разница между:

// partially-applied type named "IntOrA"
type IntOrA[A] = Either[Int, A]

и

// type projection implementing the same type anonymously (without a name).
({type L[A] = Either[Int, A]})#L

?

Они эквивалентны?


person Kevin Meredith    schedule 03.03.2016    source источник
comment
Что это за #L в конце?   -  person Yuval Itzchakov    schedule 03.03.2016
comment
@YuvalItzchakov хорошо #L обращается к члену типа, который был только что создан внутри   -  person Łukasz    schedule 04.03.2016
comment
@ Лукаш А что толку от #?   -  person Yuval Itzchakov    schedule 04.03.2016
comment
@YuvalItzchakov # - это проекция типа. Это позволяет вам получить доступ к любому типу, зависящему от пути, которым является L, и рассматривать его как не зависящий от пути, т. Е. По зависимым от пути типам внутренние типы не равны при доступе с помощью ., но равны при доступе с помощью #. Подробнее см. stackoverflow.com/questions /9443004/   -  person Teliatko    schedule 04.03.2016
comment
Связанный вопрос Что такое добрый проектор   -  person Mario Galic    schedule 05.04.2020


Ответы (1)


Они почти эквивалентны, как сказано в комментарии.

Скажем, у вас есть класс trait Super[F[_]] {}, и вы хотите реализовать его там, где F[x] = Either[Int, x] вы можете написать:

type IntOrA[A] = Either[Int, A]
class B extends Super[IntOrA] {}

Но если вам нужен один лайнер, вы можете написать:

class B extends Super[({type L[A] = Either[Int, A]})#L] {}

Или с помощью kind-projector вы можете написать это так:

class B extends Super[λ(A => Either[Int, A])] {}

или даже:

class B extends Super[Either[Int, ?]] {}

нет никакой другой разницы, кроме как сделать его одной строкой и сделать этот тип анонимным.

person Archeg    schedule 03.03.2016