When std::ops traits were originally defined, we didn't support associated types. Therefore, all traits, like Add or Sub were defined as, e.g.:
pub trait Add {
fn add(self, rhs: Self) -> Self;
}
This restricts us in API flexibility. E.g., in std::time::Time, adding Time and Duration requires having add on impl Time.
The proposal is to migrate to Rust-like traits that have the result type specified as associated type. E.g.:
pub trait Add<Rhs> {
type Output;
fn add(self, rhs: Rhs) -> Self::Output;
}