Here are some functions in ML that implement the operations of
$ sml Standard ML of New Jersey, Version 110.0.3, January 30, 1998 [CM; autoload enabled] - fun member(x,[]) = false = | member(x,b::y) = = if x=b then true = else member(x,y); val member = fn : ''a * ''a list -> bool - member(4,[3,4,5]); val it = true : bool - member(4,[5,6,7]); val it = false : bool - member("hi",["hello","there","hi","to you, too"]); val it = true : bool - fun subset([],y) = true = | subset(a::x,y) = = if member(a,y) then subset(x,y) = else false; val subset = fn : ''a list * ''a list -> bool - subset([1,3,5],[2,3,4]); val it = false : bool - subset([1,3,5],[5,4,3,2,1]); val it = true : bool - fun equal(x,y) = subset(x,y) andalso subset(y,x); val equal = fn : ''a list * ''a list -> bool - equal([2,3,4],[4,3,2]); val it = true : bool - equal([2,3,4],[3,4]); val it = false : bool - fun union([],y) = y = | union(a::x,y) = = if member(a,y) then union(x,y) = else a::union(x,y); val union = fn : ''a list * ''a list -> ''a list - union([1,3,5],[2,3,4]); val it = [1,5,2,3,4] : int list - union([1,3,5],[]); val it = [1,3,5] : int list - fun intersection([],y) = [] = | intersection(a::x,y) = = if member(a,y) then a::intersection(x,y) = else intersection(x,y); val intersection = fn : ''a list * ''a list -> ''a list - intersection([1,3,5],[2,3,4]); val it = [3] : int list - intersection(union([1,2],[2,3]),[1,3,5]); val it = [1,3] : int list - fun difference([],y) = [] = | difference(a::x,y) = = if member(a,y) then difference(x,y) = else a::difference(x,y); val difference = fn : ''a list * ''a list -> ''a list - difference([1,3,5],[2,3,4]); val it = [1,5] : int list - fun insert(a,[]) = [] = | insert(a,b::y) = union([a],b)::insert(a,y); val insert = fn : ''a * ''a list list -> ''a list list - insert(3,[[1,4],[2,5]]); val it = [[3,1,4],[3,2,5]] : int list list - fun power([]) = [[]] = | power(a::y) = union(power(y),insert(a,power(y))); val power = fn : ''a list -> ''a list list - power([3,5]); val it = [[],[5],[3],[3,5]] : int list list - power([]); stdIn:97.1-97.10 Warning: type vars not generalized because of value restriction are instantiated to dummy types (X1,X2,...) val it = [[]] : ?.X1 list list - power([1,3,5]); val it = [[],[5],[3],[3,5],[1],[1,5],[1,3],[1,3,5]] : int list list < ctrl/d> $Note that the definition used for the function power uses an auxilliary function insert, where insert(a,x) will insert the element a into each of the sets listed in the set of sets x. Also note that power doesn't work properly when its argument is the empty set.
- fun merge([],y) = y = | merge(x,[]) = x = | merge(a::x,b::y) = = if a < b then a::merge(x,b::y) = else b::merge(a::x,y); val merge = fn : int list * int list -> int list - merge([1,4,5],[2,3,4]); val it = [1,2,3,4,4,5] : int list - (3,5); val it = (3,5) : int * int - fun fst(x,y) = x; val fst = fn : 'a * 'b -> 'a - fun snd(x,y) = y; val snd = fn : 'a * 'b -> 'b - fun split ([]) = ([],[]) = | split (a::[]) = ([a],[]) = | split (a::b::y) = (a::fst(split(y)),b::snd(split(y))); val split = fn : 'a list -> 'a list * 'a list - split([7,6,5,4,3,2,1,2,3,4,5,6,7]); val it = ([7,5,3,1,3,5,7],[6,4,2,2,4,6]) : int list * int list - fun mergesort([]) = [] = | mergesort([a]) = [a] = | mergesort(x) = = merge(mergesort(fst(split(x))),mergesort(snd(split(x)))); - mergesort([4,3,2]); val it = [2,3,4] : int list - mergesort([1,3,6,3,7,3,8,9,2,5]); val it = [1,2,3,3,3,5,6,7,8,9] : int listNote how a pair is created, like (3,5), as shown above. Also, fst and snd are functions defined above to pick out the first and second coordinates of a pair.
Back to the course page.