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