TiP.hs

module TiP where
import HasBaseStruct
import BaseSyntaxStruct
import TI
import TiLit(tcLit)
import TiFields(tcFieldsPat)
--import TiPrelude
import MUtils

instance HasId i (PI i p) where
  ident = HsPId
  isId (HsPId x) = Just x
  isId _ = Nothing
{-
instance (Fresh i,TypeId i,ValueId i,
          TypeCheck i inp (Typed i outp),HasLit outp,
	  HasTypeApp i outp, HasBaseStruct outp (PI i outp))
	 => TypeCheck i (PI i inp) (Typed i outp) where tc = tcP
-}
tcP p =
  case p of
    HsPId n                -> inst n
--  HsPLit l               -> emap hsPLit # tcLit0 l
    HsPLit s l             -> tcLitP s l
    HsPNeg s l             -> instPrel_srcloc s "negate" `tapp` tcLitP s l
    HsPSucc s n l          -> instPrel_srcloc s "+" `tapp` inst (HsVar n) `tapp` tcLitP s l
    HsPInfixApp x op z     -> instCon op `tapp` tc x `tapp` tc z
    HsPApp nm ps           -> tcPApp nm ps
    HsPTuple s ps          -> typedTuple =<< mapM tc ps
    HsPList  s ps          -> tcList =<< mapM tc ps
    HsPParen p             -> emap hsPParen # tc p
    HsPRec c fields        -> tcFieldsPat c fields
    HsPAsPat nm p          -> tcAsPat nm p
    HsPWildCard            -> (hsPWildCard:>:) # tfresh
    HsPIrrPat p            -> emap hsPIrrPat # tc p
  where
    tcLitP s = tcLit (hsPLit s) s

tcPApp con ps = foldl tapp (instCon con) (map tc ps)

instCon c = inst (HsCon c)

tcAsPat x p =
  do tx <- varinst x
     p' :>: tp <- tc p
     tx =:= tp
     hsPAsPat x p' >: tp

-- binary version of HsPApp (only for constructor applications):
pApp p1 p2 =
  case p1 of
    HsPId (HsCon c) -> HsPApp c [p2]
    HsPApp c ps -> HsPApp c (ps++[p2])
--  _ -> error ("pApp "++show p1)

Plain-text version of TiP.hs | Valid HTML?