data PictValue = ValInt Int | ValChan Name | ValTuple [PictValue] deriving (Show,Eq) data Name = Name Int deriving (Show, Eq) data Pattern = PatVar Name | PatTuple [Pattern] deriving (Show, Eq) -- inserire i tipi di dato sopra definiti nella classe Eq -- e' indispensabile affinche' si possa definire la funzione patMatch type Binding = Name -> (Maybe PictValue) patMatch :: Pattern -> PictValue -> Binding patMatch (PatVar (Name n)) val (Name m) | (n == m) = (Just val) | otherwise = Nothing patMatch (PatTuple []) (ValTuple []) (Name m) = Nothing patMatch (PatTuple (p:ps)) (ValTuple (v:vs)) n = (union (patMatch p v) (patMatch (PatTuple ps) (ValTuple vs)) n) patmatch _ _ _ = error "patter matching failure" myPattern = PatTuple [PatTuple [], PatTuple [PatVar (Name 3), PatVar (Name 4)]] -- corresponding to the pattern [[] [x3 x4]] myValue = ValTuple [ValTuple [], ValTuple [ValTuple [ValInt 1,ValInt 2], ValChan (Name 4)]] -- corresponding to the value [[] [[1 2] x4]] myPattern2 = PatTuple [PatTuple [], PatTuple [PatVar (Name 3), PatVar (Name 4), PatVar (Name 5)]] -- corresponding to the pattern [[] [x3 x4 x5]] myBinding = patMatch myPattern myValue