Elm-0.1.2: src/Types/Types.hs
module Types where
import Data.List (intercalate)
import qualified Data.Set as Set
type X = Int
data Type = IntT
| StringT
| CharT
| BoolT
| LambdaT Type Type
| VarT X
| ADT String [Type]
deriving (Eq, Ord)
data Scheme = Forall (Set.Set X) Type deriving (Eq, Ord, Show)
element = ADT "Element" []
direction = ADT "Direction" []
form = ADT "Form" []
line = ADT "Line" []
shape = ADT "Shape" []
color = ADT "Color" []
text = ADT "List" [ADT "Text" []]
point = tupleOf [IntT,IntT]
listOf t = ADT "List" [t]
signalOf t = ADT "Signal" [t]
tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
string = listOf CharT
infixr ==>
t1 ==> t2 = LambdaT t1 t2
infix 8 -:
name -: tipe = (,) name tipe
hasType t = map (-: t)
parens = ("("++) . (++")")
instance Show Type where
show t =
case t of
{ IntT -> "Int"
; StringT -> "String"
; CharT -> "Char"
; BoolT -> "Bool"
; LambdaT t1@(LambdaT _ _) t2 -> parens (show t1) ++ " -> " ++ show t2
; LambdaT t1 t2 -> show t1 ++ " -> " ++ show t2
; VarT x -> show x
; ADT "List" [tipe] -> "[" ++ show tipe ++ "]"
; ADT name [] -> name
; ADT name cs -> parens $ name ++ " " ++ unwords (map show cs)
}