Go to home | View this page as Markdown | Gemini
datatype ’a multi = EMPTY | ELEM of ’a | UNION of ’a multi * ’a multi
data (Eq a) => Multi a = Empty | Elem a | Union (Multi a) (Multi a) deriving Show
fun number (EMPTY) _ = 0 | number (ELEM x) w = if x = w then 1 else 0 | number (UNION (x,y)) w = (number x w) + (number y w) fun test_number w = number (UNION (EMPTY, \ UNION (ELEM 4, UNION (ELEM 6, \ UNION (UNION (ELEM 4, ELEM 4), EMPTY))))) w
number Empty _ = 0 number (Elem x) w = if x == w then 1 else 0 test_number w = number (Union Empty \ (Union (Elem 4) (Union (Elem 6) \ (Union (Union (Elem 4) (Elem 4)) Empty)))) w
fun simplify (UNION (x,y)) = let fun is_empty (EMPTY) = true | is_empty _ = false val x’ = simplify x val y’ = simplify y in if (is_empty x’) andalso (is_empty y’) then EMPTY else if (is_empty x’) then y’ else if (is_empty y’) then x’ else UNION (x’, y’) end | simplify x = x
simplify (Union x y) | (isEmpty x’) && (isEmpty y’) = Empty | isEmpty x’ = y’ | isEmpty y’ = x’ | otherwise = Union x’ y’ where isEmpty Empty = True isEmpty _ = False x’ = simplify x y’ = simplify y simplify x = x
fun delete_all m w = let fun delete_all’ (ELEM x) = if x = w then EMPTY else ELEM x | delete_all’ (UNION (x,y)) = UNION (delete_all’ x, delete_all’ y) | delete_all’ x = x in simplify (delete_all’ m) end
delete_all m w = simplify (delete_all’ m) where delete_all’ (Elem x) = if x == w then Empty else Elem x delete_all’ (Union x y) = Union (delete_all’ x) (delete_all’ y) delete_all’ x = x
fun delete_one m w = let fun delete_one’ (UNION (x,y)) = let val (x’, deleted) = delete_one’ x in if deleted then (UNION (x’, y), deleted) else let val (y’, deleted) = delete_one’ y in (UNION (x, y’), deleted) end end | delete_one’ (ELEM x) = if x = w then (EMPTY, true) else (ELEM x, false) | delete_one’ x = (x, false) val (m’, _) = delete_one’ m in simplify m’ end
delete_one m w = do let (m’, _) = delete_one’ m simplify m’ where delete_one’ (Union x y) = let (x’, deleted) = delete_one’ x in if deleted then (Union x’ y, deleted) else let (y’, deleted) = delete_one’ y in (Union x y’, deleted) delete_one’ (Elem x) = if x == w then (Empty, True) else (Elem x, False) delete_one’ x = (x, False)
fun make_map_fn f1 = fn (x,y) => f1 x :: y make_map_fn f1 = \x y -> f1 x : y fun make_filter_fn f1 = fn (x,y) => if f1 x then x :: y else y make_filter_fn f1 = \x y -> if f1 then x : y else y fun my_map f l = foldr (make_map_fn f) [] l my_map f l = foldr (make_map_fn f) [] l fun my_filter f l = foldr (make_filter_fn f) [] l my_filter f l = foldr (make_filter_fn f) [] l