Для чего нужны типовые проекции в Scala?Почему система типов Scala поддерживает как проекции типов, так и типы, зависящие от пути?Каково было обоснование этого дизайнерского решения?
Не полный ответ, но вот некоторые примеры использования проекций типов, с которыми я столкнулся:
Метапрограммирование на уровне типа . Примеры см. В сериях Михида (части I , II , III ), реализации Джеспера в HList и серии на Apocalisp .
Обходной путь для включения вывода типа (например, вот некоторые предыдущие вопросы SO 1 , 2 , 3 ).
Способ объединения группы типов в один параметр типа. Например, в матричной библиотеке, которую я разрабатываю, я определяю trait Scalar { type A; type B; type C; ... }, а затем передаю ее в качестве отдельного параметра для моей характеристики матрицы, trait Matrix[S <: Scalar] .... Отдельные типы могут упоминаться как S#A, S#B и скоро. Между двумя матрицами типа Matrix[S] для одного и того же S эти типы будут совместимы (в отличие от случая с типами, зависящими от пути).
trait Scalar { type A; type B; type C; ... }
trait Matrix[S <: Scalar] ...
S#A
S#B
Matrix[S]
S
Для проекций частичного типа можно использовать одну проекцию типа:
({type λ[x]=Tuple2[Int,x]})#λ