Faking ADTs and GADTs in Languages That Shouldn't Have Them - haskell | Upit