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)