我正在尝试编写三个可用于在 SML 中操作集合的函数定义。如您所见,我们将实现基于列表。
Union 是 Set s 和 Set t 中所有元素的集合。(不允许重复)
交集是其中元素同时属于 Set s 和 Set t 的集合。
如果 Set s 和 Set t 是集合,那么 Set s 在 Set t 中的相对补集是 Set t 中的元素集合,而不是 Set s 中的元素集合。
现在代码如下所示:
fun filter p [] = []
| filter p (h::t) =
if p h
then h :: (filter p t)
else (filter p t);
fun mem [] a = false
| mem (h::t) a = (a=h) orelse (mem t a);
signature SETS =
sig
type ''a set
val union : ''a set -> ''a set -> ''a set
val intersection : ''a set -> ''a set -> ''a set
val difference : ''a set -> ''a set -> ''a set
end;
structure Set : SETS =
struct
type ''a set = ''a list;
fun union s t = **(Code goes here)**
fun intersection s t = **(Code goes here)**
fun difference s t = **(Code goes here)**
end;
如您所见,需要时使用两个帮助函数 - mem 和 filter.filter 将通过一个列表并只保留满足某个布尔函数 p 的那些元素,而 mem 只是检查一个列表以查看它是否包含值 a .