Using traits for bounds on generics

The most widespread use of traits is for writing generic functions or types. For example, the following signature describes a function for consuming any iterator yielding items of type A`Ato produce a collection of` to produce a collection of A`A`:

fn main() { fn from_iter<T: Iterator<A>>(iterator: T) -> SomeCollection<A> }
fn from_iter<T: Iterator<A>>(iterator: T) -> SomeCollection<A>

Here, the Iterator`Iteratortrait is specifies an interface that a type` trait is specifies an interface that a type T`T` must explicitly implement to be used by this generic function.

Pros:

Cons:

Favor widespread traits. [FIXME: needs RFC]

Generic types are a form of abstraction, which entails a mental indirection: if a function takes an argument of type T`Tbounded by` bounded by Trait`Trait, clients must first think about the concrete types that implement`, clients must first think about the concrete types that implement Trait`Trait` to understand how and when the function is callable.

To keep the cost of abstraction low, favor widely-known traits. Whenever possible, implement and use traits provided as part of the standard library. Do not introduce new traits for generics lightly; wait until there are a wide range of types that can implement the type.