class One (M : Type u) where one : M instance {M} [One M] : OfNat M (nat_lit 1) := ⟨One.one⟩ class Monoid (M : Type u) extends Mul M, One M where mul_one (m : M) : m * 1 = m class AddCommMonoid (A : Type u) extends Add A, Zero A class MonoidWithZero (M₀ : Type u) extends Monoid M₀, Zero M₀ class Semiring (R : Type u) extends AddCommMonoid R, MonoidWithZero R, One R #print Semiring -- only toMonoid field, no duplicate toOne def oneViaMonoid {M} [Monoid M] : M := 1 example {R} [Semiring R] : (1 : R) = oneViaMonoid := rfl example : Semiring Nat where mul_one := by simp zero := 0 one := 1