Sums and Maps (products) indexed by a typelevel map of their field
(or constructor) names and types. They can be combined and split
again; their typelevel map is sorted to ensure that the end result
is independent of the order you combine it in.
Data.NamedSOP.Generic contains functions for automatically
converting between types with a Generic instance and named sums of
products: