Subversion

Galculator

?curdirlinks? -

Blame information for rev 7

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 -------------------------------------------------------------------------------

Theme by Vikram Singh | Powered by WebSVN v2.3.3