For the record, here is a minimized case where Rust compiler gives incorrect suggestion (regarding a typeclass), but that’s still a good starting point https://www.ideone.com/MD2Ah8
trait SuperTrait {
type Raw;
fn raw(&self) -> Self::Raw;
}
trait SubTrait: SuperTrait<Raw=i32> {}
// compiler suggests changing 'B' to 'B: SuperTrait'
// while correct solution is 'B: SubTrait'
fn generic_method<A: SubTrait, B>(a: A, b: B) -> A::Raw {
a.raw() + b.raw()
}
fn main() {}
Result:
error: no method named `raw` found for type `B` in the current scope
--> prog.rs:12:17
|
12 | a.raw() + b.raw()
| ^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `raw`, perhaps you need to implement it:
= help: candidate #1: `SuperTrait`