set_option structureDiamondWarning false class Foo (α : Type) extends Add α where zero : α class FooComm (α : Type) extends Foo α where comm (a b : α) : a + b = b + a class FooAssoc (α : Type) extends Foo α, Mul α where add_assoc (a b c : α) : (a + b) + c = a + (b + c) mul_assoc (a b c : α) : (a * b) * c = a * (b * c) class FooAC (α : Type) extends FooComm α, FooAssoc α where mul_comm (a b : α) : a * b = b * a set_option pp.all true #check @FooAC.mk #print FooAC.toFooAssoc class FooAssoc' (α : Type) extends FooAssoc α where one : α class FooAC' (α : Type) extends FooComm α, FooAssoc' α where mul_comm (a b : α) : a * b = b * a #check @FooAC'.mk #print FooAC'.toFooAssoc' def f [FooAssoc α] (a : α) : α := a * a def g [FooAC' α] (a : α) : α := f (a + FooAssoc'.one)