-- | 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)