From the std libary documentation:

```
If every type inside a tuple implements one of the following traits, then a tuple itself also implements it:
Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash
```

Is there a reason why the same is not true for traits like:

- Zero, One
- Neg, Not
- Add, Sub, Div, Mul, Rem (and their *Assign counterparts)
- BitAnd, BitOr, BitXor (and their *Assign counterparts)
- Shl, Shr (and their *Assign counterparts)
- Drop

I fail to see why we couldn’t have:

```
let a: (X, Y, Z) = (x0, y0, z0);
let b: (X, Y, Z) = (x1, y1, z1);
assert_eq!(a + b, (x0 + x1, y0 + y1, z0 + z1));
```

and possibly for homogeneous tuples:

```
let a: (X, X, X) = (x0, x1, x2);
let n: X = x;
assert_eq!(a * n, (x0 * x, x1 * x, x2 * x));
```