on cbecda2 help sign in
elk/elm/src/Types/Types.hs
67 lines 1.6 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
33maybeOf t = ADT "Maybe" [t]
34string = listOf CharT
35time = IntT
37jsBool = ADT "JSBool" []
38jsNumber = ADT "JSNumber" []
39jsString = ADT "JSString" []
40jsElement = ADT "JSElement" []
41jsArray t = ADT "JSArray" [t]
42jsTuple ts = ADT ("JSTuple" ++ show (length ts)) ts
44infixr ==>
45t1 ==> t2 = LambdaT t1 t2
47infix 8 -:
48name -: tipe = (,) name tipe
50hasType t = map (-: t)
52parens = ("("++) . (++")")
54instance Show Type where
55 show t =
56 case t of
57 { IntT -> "Int"
58 ; StringT -> "String"
59 ; CharT -> "Char"
60 ; BoolT -> "Bool"
61 ; LambdaT t1@(LambdaT _ _) t2 -> parens (show t1) ++ " -> " ++ show t2
62 ; LambdaT t1 t2 -> show t1 ++ " -> " ++ show t2
63 ; VarT x -> show x
64 ; ADT "List" [tipe] -> "[" ++ show tipe ++ "]"
65 ; ADT name [] -> name
66 ; ADT name cs -> parens $ name ++ " " ++ unwords (map show cs)
67 }