 Type inference in the absence of any programmer supplied type annotations is undecidable and functions defined over GADTs do not admit principal types in general.Type reconstruction requires several design trade-offs and is an area of active research (; ; ; ; ; ; ; ; ; ).Applications of GADTs include generic programming, modelling programming languages (higher-order abstract syntax), maintaining invariants in data structures, expressing constraints in embedded domain-specific languages, and modelling objects.