-- | Sets, represented by their characteristic functions
-- An example of using functions to represent data
-- Functional Programming course 2018.
-- Thomas Hallgren
{-
This started as a skeleton, the definitions were filled in
during the lecture.
-}
--------------------------------------------------------------------------------
module Set(Set,
empty, singleton, insert,
union, intersection, difference, complement,
member) where
newtype Set a = Set (a->Bool)
empty :: Set b
singleton :: Eq a => a -> Set a
insert :: Eq a => a -> Set a -> Set a
union :: Set a -> Set a -> Set a
intersection :: Set a -> Set a -> Set a
complement :: Set a -> Set a
difference :: Set a -> Set a -> Set a
member :: a -> Set a -> Bool
member x (Set f) = f x
empty = Set (\x->False)
singleton x = Set (==x)
insert x s = union (singleton x) s
union (Set f) (Set g) = Set (\x->f x || g x)
intersection (Set f) (Set g) = Set (\x->f x && g x)
complement (Set f) = Set (not . f)
difference s1 s2 = intersection s1 (complement s2)