This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(* abstract data types with closures *) | |
datatype set = S of { insert : int -> set, | |
member : int -> bool, | |
size : unit -> int } | |
val empty_set = | |
let | |
fun make_set xs = (* xs is a private field in result *) | |
let | |
fun contains i = List.exists (fn j => i=j) xs | |
in | |
S { insert = fn i => if contains i | |
then make_set xs | |
else make_set (i::xs), | |
member = contains, | |
size = fn () => length xs | |
} | |
end | |
in | |
make_set [] | |
end | |
(* example of using our newly described set *) | |
fun use_sets() = | |
let val S s1 = empty_set | |
val S s2 = (#insert s1) 34 | |
val S s3 = (#insert s2) 34 | |
val S s4 = #insert s3 19 | |
in | |
if (#member s4) 42 | |
then 99 | |
else if (#member s4) 19 | |
then 17 + (#size s3) () | |
else 0 | |
end |
No comments:
Post a Comment