Home | Markdown | Gemini | Microblog
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