Subversion

Galculator

?curdirlinks? - Rev 7

?prevdifflink? - Blame



{-# OPTIONS_GHC -Wall #-}

-------------------------------------------------------------------------------

{- |
Module      :  Language.R.Constraint
Description :  Type equation constraints infered from type annotations of
               representations of functions.
Copyright   :  (c) Paulo Silva
License     :  LGPL

Maintainer  :  paufil@di.uminho.pt
Stability   :  experimental
Portability :  portable

-}


-------------------------------------------------------------------------------

module Language.R.Constraint (
  rConstraint
 ) where

import Control.Monad
import Control.MonadOr
import Language.R.Equality
import Language.R.Syntax
import Language.Type.Constraint

-------------------------------------------------------------------------------

rConstraint :: MonadOr m => R a -> R b -> m [Constraint]
rConstraint (Var _) _ = return []
rConstraint _ (Var _) = return []
rConstraint (NEG r) (NEG r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (MEET r s) (MEET r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (JOIN r s) (JOIN r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (CONV r) (CONV r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (COMP t f g) (COMP t' f' g') = do
  ff <- rConstraint f f'
  gg <- rConstraint g g'
  return $ [t :=: t'] ++ ff ++ gg
rConstraint (SPLIT r s) (SPLIT r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (ORD o) (ORD o') = do
  oo <- rConstraint o o'
  return oo
rConstraint (FUN f) (FUN f') = do
  ff <- rConstraint f f'
  return ff
rConstraint (LEFTSEC t s r) (LEFTSEC t' s' r') = do
  ss <- rConstraint s s'
  rr <- rConstraint r r'
  return $ [t :=: t'] ++ ss ++ rr
rConstraint (RIGHTSEC t s r) (RIGHTSEC t' s' r') = do
  ss <- rConstraint s s'
  rr <- rConstraint r r'
  return $ [t :=: t'] ++ ss ++ rr
rConstraint (APPLY t r v) (APPLY t' r' v') = do
  rr <- rConstraint r r'
  vv <- rConstraint v v'
  return $ [t :=: t'] ++ rr ++ vv
rConstraint (DEF n t) (DEF n' t') = do
  guard (n == n')
  return [t :=: t']
rConstraint (PROD r s) (PROD r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (EITHER r s) (EITHER r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (MAYBE r) (MAYBE r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (LIST r) (LIST r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (SET r) (SET r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (MAP r) (MAP r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (REYNOLDS r s) (REYNOLDS r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (FComp t f g) (FComp t' f' g') = do
  ff <- rConstraint f f'
  gg <- rConstraint g g'
  return $ [t :=: t'] ++ ff ++ gg
rConstraint (OComp r s) (OComp r' s') = do
  rr <- rConstraint r r'
  ss <- rConstraint s s'
  return $ rr ++ ss
rConstraint (OConv r) (OConv r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (OJoin r) (OJoin r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (OMax r) (OMax r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (OMin r) (OMin r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (GDef n f1 f2 o1 o2) (GDef n' f1' f2' o1' o2') = do
  guard (n == n')
  ff1 <- rConstraint f1 f1'
  ff2 <- rConstraint f2 f2'
  oo1 <- rConstraint o1 o1'
  oo2 <- rConstraint o2 o2'
  return $ ff1 ++ ff2 ++ oo1 ++ oo2
rConstraint (GComp t f g) (GComp t' f' g') = do
  ff <- rConstraint f f'
  gg <- rConstraint g g'
  return $ [t :=: t'] ++ ff ++ gg
rConstraint (GConv r) (GConv r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (GLAdj r) (GLAdj r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (GUAdj r) (GUAdj r') = do
  rr <- rConstraint r r'
  return rr
rConstraint (GLOrd t r) (GLOrd t' r') = do
  rr <- rConstraint r r'
  return $ [t :=: t'] ++ rr
rConstraint (GUOrd t r) (GUOrd t' r') = do
  rr <- rConstraint r r'
  return $ [t :=: t'] ++ rr
rConstraint f g =
  if req f g then return [] else mzero

-------------------------------------------------------------------------------
 

Theme by Vikram Singh | Powered by WebSVN v2.3.3