A Haskell program and library to derive instances for data types