
I'm not going to do the whole thing for you but I can help start you off. The type level string you think of is called Symbol. Symbol is a kind on it's own and not (*) it has a type for every string. You can use the functions in the following link to work with them. https://hackage.haskell.org/package/base-4.8.1.0/docs/GHC-TypeLits.html so you might have newtype (symbol :: Symbol) ::: value = Field value you can basically use any typelevel combinator you want for Sum e.g. ("foo" ::: Int) `(,)` ("bar" ::: Char) `(,)` ... or make your own You will have to use type families which are basically type level functions to merge two sums. If you run into trouble you can have a look at the following link which does some similar things. https://hackage.haskell.org/package/type-level-sets-0.5/docs/Data-Type-Set.h... P.S. Prepare for a headache Cheers Silvio