template haskell vs generics