How to circumvent return type polymorphism using GADTs in Haskell
philipphagenlocher.de