trait HasNil {
nil() -> Self
}
trait HasOne {
one() -> Self
}
trait AddMonoid: Add + HasNil {}
trait MulMonoid: Mul + HasOne {}
trait Semiring: AddMonoid + MulMonoid {}
trait StarSemiring: Semiring {
star(Self) -> Self
}
trait Inverse {
inverse(Self) -> Self
}