Catching DSL Type Errors at Compile Time with Haskell GADTs
Standard Haskell ADTs treat every expression node the same, so type errors hide until runtime. GADTs index constructors by return type, letting the compiler reject invalid DSL operations before you run the program.