haskell library for conversion of arbitrary data types to a "structural form" built from the primitive sum, product types