Subversion

Galculator

?curdirlinks? -

Blame information for rev 7

Line No. Rev Author Line
1 1 paulosilva  
2 7 paulosilva {-# LANGUAGE GADTs, FlexibleContexts #-}
3 1 paulosilva {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Language.Type.Equality
9 Description :  Equality definition over the type representation.
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  
22 module Language.Type.Equality (
23   teq,
24 7 paulosilva   teqE,
25 1 paulosilva   teq',
26   beq,
27   beq'
28  ) where
29  
30 7 paulosilva import Control.GalcError
31 import Control.MonadOr
32 import Control.Monad.Error
33 1 paulosilva import Data.Equal
34 import {-# SOURCE #-} Language.Type.Syntax
35  
36 -------------------------------------------------------------------------------
37  
38 7 paulosilva teqE :: MonadError GalcError m => Type a -> Type b -> m (Equal a b)
39 teqE t1 t2 = maybe2error EqualityError  $ teq t1 t2
40  
41 teq :: MonadOr m => Type a -> Type b -> m (Equal a b)
42 1 paulosilva teq (TVar n1) (TVar n2) = do
43   guard (n1 == n2)
44   return Eq
45 teq One One = return Eq
46 teq Bool Bool = return Eq
47 teq Char Char = return Eq
48 teq String String = return Eq
49 teq Int Int = return Eq
50 teq Float Float = return Eq
51 teq (Prod a b) (Prod a' b') = do
52   Eq <- teq a a'
53   Eq <- teq b b'
54   return Eq
55 teq (Either a b) (Either a' b') = do
56   Eq <- teq a a'
57   Eq <- teq b b'
58   return Eq
59 teq (Maybe a) (Maybe a') = do
60   Eq <- teq a a'
61   return Eq
62 teq (List a) (List a') = do
63   Eq <- teq a a'
64   return Eq
65 teq (Set a) (Set a') = do
66   Eq <- teq a a'
67   return Eq
68 teq (Map a b) (Map a' b') = do
69   Eq <- teq a a'
70   Eq <- teq b b'
71   return Eq
72 teq (Fun b a) (Fun b' a') = do
73   Eq <- teq a a'
74   Eq <- teq b b'
75   return Eq
76 teq (Rel b a) (Rel b' a') = do
77   Eq <- teq a a'
78   Eq <- teq b b'
79   return Eq
80 teq (Ord a) (Ord a') = do
81   Eq <- teq a a'
82   return Eq
83 teq (GC b a) (GC b' a') = do
84   Eq <- teq a a'
85   Eq <- teq b b'
86   return Eq
87 teq _ _ = mzero
88  
89 -------------------------------------------------------------------------------
90  
91 teq' :: MonadPlus m => Type a -> Type b -> m (Equal a b)
92 teq' (TVar _) (TVar _) = do
93   return Eq
94 teq' One One = return Eq
95 teq' Bool Bool = return Eq
96 teq' Char Char = return Eq
97 teq' String String = return Eq
98 teq' Int Int = return Eq
99 teq' Float Float = return Eq
100 teq' (Prod a b) (Prod a' b') = do
101   Eq <- teq' a a'
102   Eq <- teq' b b'
103   return Eq
104 teq' (Either a b) (Either a' b') = do
105   Eq <- teq' a a'
106   Eq <- teq' b b'
107   return Eq
108 teq' (Maybe a) (Maybe a') = do
109   Eq <- teq' a a'
110   return Eq
111 teq' (List a) (List a') = do
112   Eq <- teq' a a'
113   return Eq
114 teq' (Set a) (Set a') = do
115   Eq <- teq' a a'
116   return Eq
117 teq' (Map a b) (Map a' b') = do
118   Eq <- teq' a a'
119   Eq <- teq' b b'
120   return Eq
121 teq' (Fun b a) (Fun b' a') = do
122   Eq <- teq' a a'
123   Eq <- teq' b b'
124   return Eq
125 teq' (Rel b a) (Rel b' a') = do
126   Eq <- teq' a a'
127   Eq <- teq' b b'
128   return Eq
129 teq' (Ord a) (Ord a') = do
130   Eq <- teq' a a'
131   return Eq
132 teq' (GC b a) (GC b' a') = do
133   Eq <- teq' a a'
134   Eq <- teq' b b'
135   return Eq
136 teq' _ _ = mzero
137  
138 -------------------------------------------------------------------------------
139  
140 beq :: Type a -> Type b -> Bool
141 beq a a' = maybe False (const True) (teq a a')
142  
143 -------------------------------------------------------------------------------
144  
145 beq' :: Type a -> Type b -> Bool
146 beq' a a' = maybe False (const True) (teq' a a')
147  
148 -------------------------------------------------------------------------------

Theme by Vikram Singh | Powered by WebSVN v2.3.3