HaRe-0.6: tools/base/tests/FunDep2.hs
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