on e33d329 help sign in
elk/src/Types/Types.hs
58 lines 1.3 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" []
23form = ADT "Form" []
24line = ADT "Line" []
25shape = ADT "Shape" []
26color = ADT "Color" []
27text = ADT "List" [ADT "Text" []]
28point = tupleOf [IntT,IntT]
30listOf t = ADT "List" [t]
31signalOf t = ADT "Signal" [t]
32tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
33string = listOf CharT
35infixr ==>
36t1 ==> t2 = LambdaT t1 t2
38infix 8 -:
39name -: tipe = (,) name tipe
41hasType t = map (-: t)
43parens = ("("++) . (++")")
45instance Show Type where
46 show t =
47 case t of
48 { IntT -> "Int"
49 ; StringT -> "String"
50 ; CharT -> "Char"
51 ; BoolT -> "Bool"
52 ; LambdaT t1@(LambdaT _ _) t2 -> parens (show t1) ++ " -> " ++ show t2
53 ; LambdaT t1 t2 -> show t1 ++ " -> " ++ show t2
54 ; VarT x -> show x
55 ; ADT "List" [tipe] -> "[" ++ show tipe ++ "]"
56 ; ADT name [] -> name
57 ; ADT name cs -> parens $ name ++ " " ++ unwords (map show cs)
58 }