type checking pattern bindings

This commit is contained in:
aarne
2006-01-13 13:47:15 +00:00
parent 621ca0c43d
commit 17449e42ba
2 changed files with 19 additions and 8 deletions

View File

@@ -697,16 +697,26 @@ pattContext env typ p = case p of
g <- pattContext env typ p g <- pattContext env typ p
return $ (x,typ):g return $ (x,typ):g
PAlt p q -> do PAlt p' q -> do
g1 <- pattContext env typ p g1 <- pattContext env typ p'
g2 <- pattContext env typ q g2 <- pattContext env typ q
return $ filter (flip elem g1) g2 -- must be in both let pts = [pt | pt <- g1, notElem pt g2] ++ [pt | pt <- g2, notElem pt g1]
checkCond
("incompatible bindings of" +++
unwords (nub (map (prt . fst) pts))+++
"in pattern alterantives" +++ prt p) (null pts)
return g1 -- must be g1 == g2
PSeq p q -> do PSeq p q -> do
g1 <- pattContext env typ p g1 <- pattContext env typ p
g2 <- pattContext env typ q g2 <- pattContext env typ q
return $ g1 ++ g2 return $ g1 ++ g2
PRep p -> pattContext env typeStr p PRep p' -> do
PNeg p -> pattContext env typeStr p co <- pattContext env typeStr p'
if not (null co)
then checkWarn ("no variable bound inside * pattern" +++ prt p)
>> return []
else return []
PNeg p' -> pattContext env typ p'
_ -> return [] ---- check types! _ -> return [] ---- check types!
where where

View File

@@ -105,9 +105,10 @@ tryMatch (p,t) = do
return (concat matches) return (concat matches)
(PRep p1, ([],K s, [])) -> checks [ (PRep p1, ([],K s, [])) -> checks [
trym (foldr (const (PSeq p1)) (PString "") [1..n]) t' | n <- [0 .. length s] trym (foldr (const (PSeq p1)) (PString "")
] [1..n]) t' | n <- [0 .. length s]
] >>
return []
_ -> prtBad "no match in case expr for" t _ -> prtBad "no match in case expr for" t
isInConstantForm :: Term -> Bool isInConstantForm :: Term -> Bool