on e041457 help sign in
elk/src/Types/Types.hs
50 lines 1.1 kB history raw
2module Types where
4import Data.List (intercalate)
5import qualified Data.Set as Set
7type X = Int
9data Type = IntT
10 | StringT
11 | CharT
12 | BoolT
13 | LambdaT Type Type
14 | VarT X
15 | ADT String [Type]
16 deriving (Eq, Ord)
18data Scheme = Forall (Set.Set X) Type deriving (Eq, Ord, Show)
20element = ADT "Element" []
21direction = ADT "Direction" []
22text = ADT "Text" []
23listOf t = ADT "List" [t]
24tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
25string = listOf CharT
27infixr ==>
28t1 ==> t2 = LambdaT t1 t2
30infix 8 -:
31name -: tipe = (,) name tipe
33hasType t = map (-: t)
35parens = ("("++) . (++")")
37instance Show Type where
38 show t =
39 case t of
40 { IntT -> "Int"
41 ; StringT -> "String"
42 ; CharT -> "Char"
43 ; BoolT -> "Bool"
44 ; LambdaT t1@(LambdaT _ _) t2 -> parens (show t1) ++ " -> " ++ show t2
45 ; LambdaT t1 t2 -> show t1 ++ " -> " ++ show t2
46 ; VarT x -> show x
47 ; ADT "List" [tipe] -> "[" ++ show tipe ++ "]"
48 ; ADT name [] -> name
49 ; ADT name cs -> parens $ name ++ " " ++ unwords (map show cs)
50 }