Они почти эквивалентны, как сказано в комментарии.
Скажем, у вас есть класс 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
#L
в конце? - person Yuval Itzchakov   schedule 03.03.2016#L
обращается к члену типа, который был только что создан внутри - person Łukasz   schedule 04.03.2016#
? - person Yuval Itzchakov   schedule 04.03.2016#
- это проекция типа. Это позволяет вам получить доступ к любому типу, зависящему от пути, которым является L, и рассматривать его как не зависящий от пути, т. Е. По зависимым от пути типам внутренние типы не равны при доступе с помощью.
, но равны при доступе с помощью#
. Подробнее см. stackoverflow.com/questions /9443004/ - person Teliatko   schedule 04.03.2016