-implementation module Data.GenType
+implementation module GenType
import StdEnv, StdGeneric
import Control.Applicative
typeName (TyArrow l r) = typeName l +++ "->" +++ typeName r
typeName (TyArray s a) = "{" +++ toString s +++ typeName a +++ "}"
typeName (TyUList s a) = "[#" +++ toString s +++ typeName a +++ "]"
-typeName (TyUMaybe a) = "?" +++ typeName a
+typeName (TyUMaybe a) = "?#" +++ typeName a
typeName (TyNewType i _ _) = i.gtd_name
typeName (TyObject i _) = i.gtd_name
typeName (TyRecord i _) = i.grd_name
typeGenType (TyArray s a) = GenTypeApp (GenTypeCons (toString s)) <$> typeGenType a
typeGenType (TyUList s a) = [GenTypeCons "_#Nil":GenTypeApp (GenTypeCons (toString s)) <$> typeGenType a]
typeGenType (TyUMaybe a) = [GenTypeCons "_#Nothing":GenTypeApp (GenTypeCons "_#Just") <$> typeGenType a]
-typeGenType (TyNewType _ _ a) = abort "typeGenType for newtypes not yet implemented\n"
+typeGenType (TyNewType _ i a) = [i.gcd_type]
typeGenType (TyRecord i _) = [i.grd_type]
typeGenType (TyObject _ fs) = [c.gcd_type\\(c, _)<-fs]
genTypeKind ts = foldr (KArrow) KStar $ map snd $ sortBy ((<) `on` fst) $ foldr (\t->gt t id) [] ts
where
gt :: GenType (Kind -> Kind) [(Int, Kind)] -> [(Int, Kind)]
- gt (GenTypeCons _) c ks = ks
- gt (GenTypeVar i) c ks = case lookup i ks of
- Nothing = [(i, c KStar):ks]
- Just KStar = [(i, c KStar):filter ((<>)i o fst) ks]
- Just _ = ks
- gt (GenTypeArrow l r) c ks = gt l id $ gt r id ks
+ gt (GenTypeCons _) _ ks = ks
+ gt (GenTypeVar i) c ks
+ # k = c KStar
+ = case lookup i ks of
+ Nothing = [(i, k):ks]
+ Just k`
+ | numArr k` > numArr k = ks
+ = [(i, k):filter ((<>)i o fst) ks]
+ gt (GenTypeArrow l r) _ ks = gt l id $ gt r id ks
gt (GenTypeApp l r) c ks = gt l ((KArrow) KStar o c) $ gt r id ks
-instance toString Kind where toString k = concat $ print k []
-instance print Kind
+
+numArr :: Kind -> Int
+numArr KStar = 0
+numArr (l KArrow r) = inc (numArr l + numArr r)
+
+instance == Kind
where
- print KStar c = ["*":c]
- print (l KArrow r) c = ["(":print l ["->":print r [")":c]]]
+ (==) KStar KStar = True
+ (==) (l1 KArrow r1) (l2 KArrow r2) = l1 == l2 && r1 == r2
+ (==) _ _ = False
+instance toString Kind where toString k = concat $ pr k False []
+
+
+pr :: Kind Bool [String] -> [String]
+pr KStar _ c = ["*":c]
+pr (l KArrow r) b c = [if b "(" "":pr l True ["->":pr r False [if b ")" "":c]]]
instance isBuiltin String
where