module FunDep2 where import FunDep --instance C (a,Int) a where f = fst --instance C (Int,b) b where f = snd instance (C a d,C d c) => C (a,b) (a,b,c) where f (x,y) = (x,y,f (f x)) --instance C a c => C (a,b) (a,b,c) g x = f (x, x) bla = g False class QualNames qn m n | qn -> m n, m n -> qn where getQualifier :: qn -> Maybe m getQualified :: qn -> n mkUnqual :: n -> qn mkQual :: m -> n -> qn class HasBaseName ie ib | ie->ib where getBaseName :: ie -> ib bq n = getQualifier (getBaseName n) newtype M = M String newtype Id = Id String data Q = Q M Id | U Id data PN i = PN i instance Functor PN where fmap f (PN x) = PN (f x) instance HasBaseName (PN i) i where getBaseName (PN i) = i instance QualNames Q M Id where getQualifier (Q m x) = Just m getQualifier _ = Nothing getQualified (Q m x) = x getQualified (U x) = x mkUnqual x = U x mkQual q x = Q q x instance QualNames qn m n => QualNames (PN qn) m (PN n) where getQualifier = bq getQualified = fmap getQualified mkUnqual = fmap mkUnqual mkQual m = fmap (mkQual m) bla2 :: QualNames q m n => PN q -> Maybe m bla2 x = bq x