1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
module TypeVar (
Number,
Name(..),
TypeOp(..),
Type(..),
Const(..),
Var(..),
mkEqualsType,
typeFunc
) where
import Data.List
type Number = Int
data Name = Name { nameSpace :: [String]
, nameId :: String } deriving (Eq, Ord)
data TypeOp = TypeOp { tyOp :: Name } deriving (Eq, Ord)
data Type = TypeVar { typeVar :: Name }
| AType { aType :: [Type]
, aTypeOp :: TypeOp } deriving (Eq, Ord)
data Const = Const { constName :: Name } deriving (Eq, Ord)
data Var = Var { varName :: Name
, varTy :: Type } deriving (Eq, Ord)
instance Show Name where
show a = intercalate "." (nameSpace a ++ [nameId a])
instance Show TypeOp where
show a = "typeOp " ++ (show $ tyOp a)
instance Show Type where
show (TypeVar tyVar) = "typeVar " ++ (show tyVar)
show (AType list typeOp) = "type " ++ (show $ tyOp typeOp) ++ " " ++ (show list)
instance Show Const where
show (Const a) = show a
instance Show Var where
show (Var a _) = show a
mkEqualsType :: Type -> Type
mkEqualsType ty = typeFunc (AType [] (TypeOp (Name [] "bool"))) (typeFunc ty ty)
typeFunc :: Type -> Type -> Type
typeFunc ty1 ty2 = AType [ty1,ty2] (TypeOp (Name [] "->"))
|