Skip to content
  • Simon Peyton Jones's avatar
    [project @ 2004-09-30 10:35:15 by simonpj] · 23f40f0e
    Simon Peyton Jones authored
    	Add Generalised Algebraic Data Types
    This rather big commit adds support for GADTs.  For example,
        data Term a where
     	  Lit :: Int -> Term Int
    	  App :: Term (a->b) -> Term a -> Term b
    	  If  :: Term Bool -> Term a -> Term a
        eval :: Term a -> a
        eval (Lit i) = i
        eval (App a b) = eval a (eval b)
        eval (If p q r) | eval p    = eval q
        		    | otherwise = eval r
    Lots and lots of of related changes throughout the compiler to make
    this fit nicely.
    One important change, only loosely related to GADTs, is that skolem
    constants in the typechecker are genuinely immutable and constant, so
    we often get better error messages from the type checker.  See
    There's a new module types/Unify.lhs, which has purely-functional
    unification and matching for Type. This is used both in the typechecker
    (for type refinement of GADTs) and in Core Lint (also for type refinement).