diff options
author | simonpj <unknown> | 2004-09-30 10:40:21 +0000 |
---|---|---|
committer | simonpj <unknown> | 2004-09-30 10:40:21 +0000 |
commit | 23f40f0e9be6d4aa5cf9ea31d73f4013f8e7b4bd (patch) | |
tree | a4b1953b8d2f49d06a05a9d0cc49485990649cd8 /ghc/compiler/iface/BinIface.hs | |
parent | 9b6858cb53438a2651ab00202582b13f95036058 (diff) | |
download | haskell-23f40f0e9be6d4aa5cf9ea31d73f4013f8e7b4bd.tar.gz |
[project @ 2004-09-30 10:35:15 by simonpj]
------------------------------------
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).
Diffstat (limited to 'ghc/compiler/iface/BinIface.hs')
-rw-r--r-- | ghc/compiler/iface/BinIface.hs | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/ghc/compiler/iface/BinIface.hs b/ghc/compiler/iface/BinIface.hs index a0e932ed88..286c612dfb 100644 --- a/ghc/compiler/iface/BinIface.hs +++ b/ghc/compiler/iface/BinIface.hs @@ -693,10 +693,13 @@ instance Binary IfaceExpr where putByte bh 4 put_ bh ag put_ bh ah - put_ bh (IfaceCase ai aj ak) = do +-- gaw 2004 + put_ bh (IfaceCase ai aj al ak) = do putByte bh 5 put_ bh ai put_ bh aj +-- gaw 2004 + put_ bh al put_ bh ak put_ bh (IfaceLet al am) = do putByte bh 6 @@ -734,8 +737,11 @@ instance Binary IfaceExpr where return (IfaceApp ag ah) 5 -> do ai <- get bh aj <- get bh +-- gaw 2004 + al <- get bh ak <- get bh - return (IfaceCase ai aj ak) +-- gaw 2004 + return (IfaceCase ai aj al ak) 6 -> do al <- get bh am <- get bh return (IfaceLet al am) @@ -874,7 +880,7 @@ instance Binary IfaceDecl where put_ bh idinfo put_ bh (IfaceForeign ae af) = error "Binary.put_(IfaceDecl): IfaceForeign" - put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7) = do + put_ bh (IfaceData a1 a2 a3 a4 a5 a6) = do putByte bh 2 put_ bh a1 put_ bh a2 @@ -882,7 +888,6 @@ instance Binary IfaceDecl where put_ bh a4 put_ bh a5 put_ bh a6 - put_ bh a7 put_ bh (IfaceSyn aq ar as at) = do putByte bh 3 @@ -914,8 +919,7 @@ instance Binary IfaceDecl where a4 <- get bh a5 <- get bh a6 <- get bh - a7 <- get bh - return (IfaceData a1 a2 a3 a4 a5 a6 a7) + return (IfaceData a1 a2 a3 a4 a5 a6) 3 -> do aq <- get bh ar <- get bh @@ -942,37 +946,53 @@ instance Binary IfaceInst where instance Binary IfaceConDecls where put_ bh IfAbstractTyCon = putByte bh 0 - put_ bh (IfDataTyCon cs) = do { putByte bh 1 - ; put_ bh cs } + put_ bh (IfDataTyCon st cs) = do { putByte bh 1 + ; put_ bh st + ; put_ bh cs } put_ bh (IfNewTyCon c) = do { putByte bh 2 ; put_ bh c } get bh = do h <- getByte bh case h of 0 -> return IfAbstractTyCon - 1 -> do aa <- get bh - return (IfDataTyCon aa) + 1 -> do st <- get bh + cs <- get bh + return (IfDataTyCon st cs) _ -> do aa <- get bh return (IfNewTyCon aa) instance Binary IfaceConDecl where - put_ bh (IfaceConDecl a1 a2 a3 a4 a5 a6 a7) = do + put_ bh (IfVanillaCon a1 a2 a3 a4 a5) = do + putByte bh 0 + put_ bh a1 + put_ bh a2 + put_ bh a3 + put_ bh a4 + put_ bh a5 + put_ bh (IfGadtCon a1 a2 a3 a4 a5 a6) = do + putByte bh 1 put_ bh a1 put_ bh a2 put_ bh a3 put_ bh a4 put_ bh a5 put_ bh a6 - put_ bh a7 get bh = do - a1 <- get bh - a2 <- get bh - a3 <- get bh - a4 <- get bh - a5 <- get bh - a6 <- get bh - a7 <- get bh - return (IfaceConDecl a1 a2 a3 a4 a5 a6 a7) + h <- getByte bh + case h of + 0 -> do a1 <- get bh + a2 <- get bh + a3 <- get bh + a4 <- get bh + a5 <- get bh + return (IfVanillaCon a1 a2 a3 a4 a5) + _ -> do a1 <- get bh + a2 <- get bh + a3 <- get bh + a4 <- get bh + a5 <- get bh + a6 <- get bh + return (IfGadtCon a1 a2 a3 a4 a5 a6) instance Binary IfaceClassOp where put_ bh (IfaceClassOp n def ty) = do |