Line No. | Rev | Author | Line |
---|---|---|---|
1 | 1 | paulosilva | |
2 | {-# OPTIONS_GHC -Wall #-} | ||
3 | |||
4 | ------------------------------------------------------------------------------- | ||
5 | |||
6 | {- | | ||
7 | Module : Language.R.Constraint | ||
8 | Description : Type equation constraints infered from type annotations of | ||
9 | representations of functions. | ||
10 | Copyright : (c) Paulo Silva | ||
11 | License : LGPL | ||
12 | |||
13 | Maintainer : paufil@di.uminho.pt | ||
14 | Stability : experimental | ||
15 | Portability : portable | ||
16 | |||
17 | -} | ||
18 | |||
19 | ------------------------------------------------------------------------------- | ||
20 | |||
21 | module Language.R.Constraint ( | ||
22 | rConstraint | ||
23 | ) where | ||
24 | |||
25 | import Control.Monad | ||
26 | 7 | paulosilva | import Control.MonadOr |
27 | 1 | paulosilva | import Language.R.Equality |
28 | import Language.R.Syntax | ||
29 | import Language.Type.Constraint | ||
30 | |||
31 | ------------------------------------------------------------------------------- | ||
32 | |||
33 | 7 | paulosilva | rConstraint :: MonadOr m => R a -> R b -> m [Constraint] |
34 | 1 | paulosilva | rConstraint (Var _) _ = return [] |
35 | rConstraint _ (Var _) = return [] | ||
36 | rConstraint (NEG r) (NEG r') = do | ||
37 | rr <- rConstraint r r' | ||
38 | return rr | ||
39 | rConstraint (MEET r s) (MEET r' s') = do | ||
40 | rr <- rConstraint r r' | ||
41 | ss <- rConstraint s s' | ||
42 | return $ rr ++ ss | ||
43 | rConstraint (JOIN r s) (JOIN r' s') = do | ||
44 | rr <- rConstraint r r' | ||
45 | ss <- rConstraint s s' | ||
46 | return $ rr ++ ss | ||
47 | rConstraint (CONV r) (CONV r') = do | ||
48 | rr <- rConstraint r r' | ||
49 | return rr | ||
50 | rConstraint (COMP t f g) (COMP t' f' g') = do | ||
51 | ff <- rConstraint f f' | ||
52 | gg <- rConstraint g g' | ||
53 | return $ [t :=: t'] ++ ff ++ gg | ||
54 | rConstraint (SPLIT r s) (SPLIT r' s') = do | ||
55 | rr <- rConstraint r r' | ||
56 | ss <- rConstraint s s' | ||
57 | return $ rr ++ ss | ||
58 | rConstraint (ORD o) (ORD o') = do | ||
59 | oo <- rConstraint o o' | ||
60 | return oo | ||
61 | rConstraint (FUN f) (FUN f') = do | ||
62 | ff <- rConstraint f f' | ||
63 | return ff | ||
64 | rConstraint (LEFTSEC t s r) (LEFTSEC t' s' r') = do | ||
65 | ss <- rConstraint s s' | ||
66 | rr <- rConstraint r r' | ||
67 | return $ [t :=: t'] ++ ss ++ rr | ||
68 | rConstraint (RIGHTSEC t s r) (RIGHTSEC t' s' r') = do | ||
69 | ss <- rConstraint s s' | ||
70 | rr <- rConstraint r r' | ||
71 | return $ [t :=: t'] ++ ss ++ rr | ||
72 | rConstraint (APPLY t r v) (APPLY t' r' v') = do | ||
73 | rr <- rConstraint r r' | ||
74 | vv <- rConstraint v v' | ||
75 | return $ [t :=: t'] ++ rr ++ vv | ||
76 | rConstraint (DEF n t) (DEF n' t') = do | ||
77 | guard (n == n') | ||
78 | return [t :=: t'] | ||
79 | rConstraint (PROD r s) (PROD r' s') = do | ||
80 | rr <- rConstraint r r' | ||
81 | ss <- rConstraint s s' | ||
82 | return $ rr ++ ss | ||
83 | rConstraint (EITHER r s) (EITHER r' s') = do | ||
84 | rr <- rConstraint r r' | ||
85 | ss <- rConstraint s s' | ||
86 | return $ rr ++ ss | ||
87 | rConstraint (MAYBE r) (MAYBE r') = do | ||
88 | rr <- rConstraint r r' | ||
89 | return rr | ||
90 | rConstraint (LIST r) (LIST r') = do | ||
91 | rr <- rConstraint r r' | ||
92 | return rr | ||
93 | rConstraint (SET r) (SET r') = do | ||
94 | rr <- rConstraint r r' | ||
95 | return rr | ||
96 | rConstraint (MAP r) (MAP r') = do | ||
97 | rr <- rConstraint r r' | ||
98 | return rr | ||
99 | 5 | paulosilva | rConstraint (REYNOLDS r s) (REYNOLDS r' s') = do |
100 | rr <- rConstraint r r' | ||
101 | ss <- rConstraint s s' | ||
102 | return $ rr ++ ss | ||
103 | 1 | paulosilva | rConstraint (FComp t f g) (FComp t' f' g') = do |
104 | ff <- rConstraint f f' | ||
105 | gg <- rConstraint g g' | ||
106 | return $ [t :=: t'] ++ ff ++ gg | ||
107 | rConstraint (OComp r s) (OComp r' s') = do | ||
108 | rr <- rConstraint r r' | ||
109 | ss <- rConstraint s s' | ||
110 | return $ rr ++ ss | ||
111 | rConstraint (OConv r) (OConv r') = do | ||
112 | rr <- rConstraint r r' | ||
113 | return rr | ||
114 | rConstraint (OJoin r) (OJoin r') = do | ||
115 | rr <- rConstraint r r' | ||
116 | return rr | ||
117 | rConstraint (OMax r) (OMax r') = do | ||
118 | rr <- rConstraint r r' | ||
119 | return rr | ||
120 | rConstraint (OMin r) (OMin r') = do | ||
121 | rr <- rConstraint r r' | ||
122 | return rr | ||
123 | rConstraint (GDef n f1 f2 o1 o2) (GDef n' f1' f2' o1' o2') = do | ||
124 | guard (n == n') | ||
125 | ff1 <- rConstraint f1 f1' | ||
126 | ff2 <- rConstraint f2 f2' | ||
127 | oo1 <- rConstraint o1 o1' | ||
128 | oo2 <- rConstraint o2 o2' | ||
129 | return $ ff1 ++ ff2 ++ oo1 ++ oo2 | ||
130 | rConstraint (GComp t f g) (GComp t' f' g') = do | ||
131 | ff <- rConstraint f f' | ||
132 | gg <- rConstraint g g' | ||
133 | return $ [t :=: t'] ++ ff ++ gg | ||
134 | rConstraint (GConv r) (GConv r') = do | ||
135 | rr <- rConstraint r r' | ||
136 | return rr | ||
137 | rConstraint (GLAdj r) (GLAdj r') = do | ||
138 | rr <- rConstraint r r' | ||
139 | return rr | ||
140 | rConstraint (GUAdj r) (GUAdj r') = do | ||
141 | rr <- rConstraint r r' | ||
142 | return rr | ||
143 | rConstraint (GLOrd t r) (GLOrd t' r') = do | ||
144 | rr <- rConstraint r r' | ||
145 | return $ [t :=: t'] ++ rr | ||
146 | rConstraint (GUOrd t r) (GUOrd t' r') = do | ||
147 | rr <- rConstraint r r' | ||
148 | return $ [t :=: t'] ++ rr | ||
149 | rConstraint f g = | ||
150 | if req f g then return [] else mzero | ||
151 | |||
152 | ------------------------------------------------------------------------------- |