[Haskell] Even higher-order abstract syntax: typeclasses vs GADT