@Aedan Smith yes we also need those instances to do auto derivation of product types. For example if you have a product type such as a data class you will be able to get a
Monoid<Account>
here because those are isomorphic to TupleN and HList
Copy code
data class Account(val balance: BigDecimal, val owners: List<String>)
fun merge(a: Account, b: Account, MA: Monoid<Account>) = MA.combine(a, b)