What are type projections in Scala useful for? Why does Scala's type system support both type projections and path dependent types? What was the rationale behind this design decision?
What Is the Purpose of Projection? Sigmund Freud believed projection to be a defense mechanism often used as a way to avoid uncomfortable repressed feelings. Feelings that are projected may be controlling, jealous, angry, or sexual in nature.
Different projections have different uses. Some projections are used for navigation, while other projections show better representations of the true relative sizes of continents.
One of the most famous map projections is the Mercator, created by a Flemish cartographer and geographer, Geradus Mercator in 1569. It became the standard map projection for nautical purposes because of its ability to represent lines of constant true direction.
Not a complete answer, but here are some uses for type projections that I have encountered:
Type level metaprogramming. For examples, see Michid's series (parts I, II, III), Jesper's implementation of HList, and the series at Apocalisp.
A workaround to enable type inference (for examples, here are some previous SO questions 1, 2, 3).
A way to bundle a bunch of types into a single type parameter. For example, in a matrix library I'm developing, I define trait Scalar { type A; type B; type C; ... }
and then pass it as a single parameter to my matrix trait, trait Matrix[S <: Scalar] ...
The individual types can be referred to as S#A
, S#B
, and so on. Between two matrices of type Matrix[S]
, for the same S
, these types will be compatible (unlike what would be the case with path dependent types).
One thing type projections can be used for is partial type application:
({type λ[x]=Tuple2[Int,x]})#λ
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With