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
66
67
68
69
70
71
72
73
74
75
76
77
|
module FlatCurry.Typed.Types
( module FlatCurry.Typed.Types
, module FlatCurry.Types
) where
import FlatCurry.Types ( QName, VarIndex, Visibility (..), TVarIndex
, TypeDecl (..), OpDecl (..), Fixity (..)
, TypeExpr (..), ConsDecl (..), NewConsDecl (..)
, Literal (..), CombType (..), CaseType (..)
)
data TProg = TProg String [String] [TypeDecl] [TFuncDecl] [OpDecl]
deriving (Eq, Read, Show)
data TFuncDecl = TFunc QName Int Visibility TypeExpr TRule
deriving (Eq, Read, Show)
data TRule
= TRule [(VarIndex, TypeExpr)] TExpr
| TExternal TypeExpr String
deriving (Eq, Read, Show)
data TExpr
= TVarE TypeExpr VarIndex
| TLit TypeExpr Literal
| TComb TypeExpr CombType QName [TExpr]
| TLet [((VarIndex, TypeExpr), TExpr)] TExpr
| TFree [(VarIndex, TypeExpr)] TExpr
| TOr TExpr TExpr
| TCase CaseType TExpr [TBranchExpr]
| TTyped TExpr TypeExpr
deriving (Eq, Read, Show)
data TBranchExpr = TBranch TPattern TExpr
deriving (Eq, Read, Show)
data TPattern
= TPattern TypeExpr QName [(VarIndex, TypeExpr)]
| TLPattern TypeExpr Literal
deriving (Eq, Read, Show)
class Typeable a where
typeOf :: a -> TypeExpr
instance Typeable TRule where
typeOf (TRule args e) = foldr (FuncType . snd) (typeOf e) args
typeOf (TExternal ty _) = ty
instance Typeable TExpr where
typeOf (TVarE ty _) = ty
typeOf (TLit ty _) = ty
typeOf (TComb ty _ _ _) = ty
typeOf (TLet _ e) = typeOf e
typeOf (TFree _ e) = typeOf e
typeOf (TOr e _) = typeOf e
typeOf (TCase _ _ (e:_)) = typeOf e
typeOf (TTyped _ ty) = ty
typeOf (TCase _ _ []) = error $ "FlatCurry.Typed.Type.typeOf: " ++
"empty list in case expression"
instance Typeable TPattern where
typeOf (TPattern ty _ _) = ty
typeOf (TLPattern ty _) = ty
instance Typeable TBranchExpr where
typeOf (TBranch _ e) = typeOf e
|