• simonpj's avatar
    [project @ 2004-09-30 10:35:15 by simonpj] · 23f40f0e
    simonpj 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
    	  ..etc..
    
        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
    TcType.TcTyVarDetails.
    
    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).
    23f40f0e
HsDecls.lhs 24.1 KB