2 % (c) The University of Glasgow 2001
6 module ExternalCore where
8 import List (elemIndex)
11 = Module Mname [Tdef] [(Bool,Vdefg)]
14 = Data Tcon [Tbind] [Cdef]
15 | Newtype Tcon [Tbind] (Maybe Ty)
18 = Constr Dcon [Tbind] [Ty]
24 type Vdef = (Var,Ty,Exp)
34 | Case Exp Vbind [Alt] {- non-empty list -}
44 = Acon (Qual Dcon) [Tbind] [Vbind] Exp
49 type Tbind = (Tvar,Kind)
66 | Lrational Rational Ty
78 type Qual t = (Mname,t)
82 equalTy t1 t2 = eqTy [] [] t1 t2
83 where eqTy e1 e2 (Tvar v1) (Tvar v2) =
84 case (elemIndex v1 e1,elemIndex v2 e2) of
85 (Just i1, Just i2) -> i1 == i2
86 (Nothing, Nothing) -> v1 == v2
88 eqTy e1 e2 (Tcon c1) (Tcon c2) = c1 == c2
89 eqTy e1 e2 (Tapp t1a t1b) (Tapp t2a t2b) =
90 eqTy e1 e2 t1a t2a && eqTy e1 e2 t1b t2b
91 eqTy e1 e2 (Tforall (tv1,tk1) t1) (Tforall (tv2,tk2) t2) =
92 tk1 == tk2 && eqTy (tv1:e1) (tv2:e2) t1 t2
95 instance Eq Ty where (==) = equalTy
97 subKindOf :: Kind -> Kind -> Bool
98 _ `subKindOf` Kopen = True
99 k1 `subKindOf` k2 = k1 == k2 -- don't worry about higher kinds
101 instance Ord Kind where (<=) = subKindOf
103 primMname = "PrelGHC"
106 tcArrow = (primMname, "ZLzmzgZR")