case class Person(name: String, age: Int) object Person { type T = (String, Int) object PersonTuple extends (Person <=> T) { def from = Function.tupled(Person.apply) def to = Person.unapply _ >>> (_.get) } implicit object PersonMonoid extends IsomorphismMonoid[Person, T] { def G = Monoid[T] def iso = PersonTuple } }