setoid, semigroup, monoid, applicative