{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} data Liste a = Ende | MkListe a (Liste a) deriving (Eq, Show) -- class Container contType elemType | contType -> elemType where class Container contType elemType where insert :: contType -> elemType -> contType instance Container [a] a where insert cont newElem = newElem : cont instance Container (Liste a) a where insert cont newElem = MkListe newElem cont -- keine fun dep: inferenz von elem-type? ins1 elem = insert [42] elem ins2 elem = insert (MkListe 42 Ende) elem {- -- keine fun dep: OK -- fun dep a::t ambiguous instance Container (a,b) a where insert (elemA,elemB) newElemA = (newElemA, elemB) instance Container (a,b) b where insert (elemA,elemB) newElemB = (elemA, newElemB) ins3 elem = insert (42, 'X') elem ins4 elem = insert (42, 'X') elem -}