Subversion

Galculator

?curdirlinks? -

Blame information for rev 7

Line No. Rev Author Line
1 1 paulosilva  
2 7 paulosilva {-# LANGUAGE GADTs, PatternSignatures, FlexibleContexts #-}
3 1 paulosilva {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Language.Type.Constraint
9 Description :  Type equation constraints for 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 module Language.Type.Constraint  (
22   Constraint(..),
23 3 paulosilva   constraint2Rule,
24 7 paulosilva   typeRewrite,
25   typeRewriteE
26 1 paulosilva  ) where
27  
28 7 paulosilva import Control.GalcError
29 import Control.Monad.Error
30 3 paulosilva import Control.MonadOr
31 1 paulosilva import Language.Type.Equality
32 import Language.Type.Rewrite
33 import Language.Type.Syntax
34  
35 -------------------------------------------------------------------------------
36  
37 data Constraint where
38   (:=:) :: Type a -> Type b -> Constraint
39  
40 instance Show Constraint where
41   show (t1 :=: t2) = show t1 ++ " = " ++ show t2
42  
43 instance Eq Constraint where
44   (a :=: b) == (a' :=: b') = beq a a' && beq b b'
45  
46 -------------------------------------------------------------------------------
47  
48 constraint2Rule :: Constraint -> Rule
49 constraint2Rule (t1 :=: t2) t1' =
50   if beq t1 t1' then return $ View t2 else mzero
51  
52 -------------------------------------------------------------------------------
53  
54 3 paulosilva typeRewrite :: MonadOr m => [Constraint] -> Type t -> m TypeBox
55 1 paulosilva typeRewrite constr t = do
56   let rules::[Rule] = map constraint2Rule constr
57 3 paulosilva   return . view2Box =<< everywhere (try (seqRules rules)) t
58 1 paulosilva  
59 -------------------------------------------------------------------------------
60 7 paulosilva  
61 typeRewriteE :: MonadError GalcError m => [Constraint] -> Type t -> m TypeBox
62 typeRewriteE constr t =
63   maybe2error (RewriteError (show t)) . typeRewrite constr $ t
64  
65 -------------------------------------------------------------------------------

Theme by Vikram Singh | Powered by WebSVN v2.3.3