data Eq a => Set a = EmptySet | Insert a (Set a) instance (Eq a, Show a) => Show(Set a) where show someset = "{ " ++ (show' (uniqueSet someset)) ++ "}" where show' EmptySet = "" show' (Insert element EmptySet) = show element show' (Insert element (Insert y someset)) = show element ++ ", " ++ show' (Insert y someset) uniqueSet :: Eq a => Set a -> Set a uniqueSet EmptySet = EmptySet uniqueSet (Insert element someset) = Insert element (deleteSet element someset) deleteSet :: Eq a => a -> Set a -> Set a deleteSet element EmptySet = EmptySet deleteSet element1 (Insert element2 someset) | element1==element2 = deleteSet element1 someset | otherwise = Insert element2 (deleteSet element1 someset) memberSet :: Eq a => a -> Set a -> Bool memberSet element EmptySet = False memberSet element (Insert element2 someset) | element == element2 = True | otherwise = memberSet element someset subSet :: Eq a => Set a -> Set a -> Bool subSet EmptySet someset = True subSet (Insert element someset) EmptySet = False subSet (Insert element1 someset1) someset2 | memberSet element1 someset2 = subSet someset1 someset2 | otherwise = False instance Eq a => Eq (Set a) where (==) someset1 someset2 = (subSet someset1 someset2) && (subSet someset2 someset1) hasPath :: Eq a => a -> a -> Set(a,a) -> Bool hasPath fromnode tonode EmptySet = fromnode == tonode hasPath fromnode tonode (Insert (somenode1,somenode2) somegraph) = ((hasPath fromnode somenode1 somegraph) && (hasPath somenode2 tonode somegraph)) || (hasPath fromnod e tonode somegraph)