Set.hs

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

Plain-text version of Set.hs | Valid HTML?