Similar to / also known as: interfaces, protocols
It is also possible to specify a combination of types, if the types are traits:
fn pythagoras(x: T, y: T) -> T where T = Add<T, Out=T> and Mul<T, Out=T>: x * x + y * y
T is a type that implements both
Intersection types are not distinct concrete types (like records or unions), just bound on existing concrete types. You cannot create an instance of
Add + Mul, but it is nonetheless very useful for type parameters.
Note that it does not make sense to create an intersection containing one or more known, concrete types.
- Two concrete types does not make sense because an object cannot have two concrete types.
- One concrete type with a trait does not make sense because a concrete type already implies a known set of traits per scope, so it is either always or never satisfied.