(* Question 1: Binary Search Trees *) type key = int; type 'a entry = key * 'a; datatype 'a tree = Empty | Node of 'a entry * 'a tree * 'a tree; fun leaves (Empty) = 1 | leaves (Node(_,left,right)) = leaves(left) + leaves(right); fun interval (i,j) (Empty) = Empty | interval (i,j) (Node(e as (key,datum), left, right)) = if i >= key then interval (i,j) right else if j <= key then interval (i,j) left else Node(e, interval (i,j) left, interval (i,j) right); (* Question 2: Abstract Types *) signature RATIONALS = sig type rat exception Undefined val quotient : int * int -> rat val fraction : rat -> int * int val plus : rat * rat -> rat val equal : rat * rat -> bool end; fun gcd (0,n) = n | gcd (m,n) = gcd (n mod m, m); structure R :> RATIONALS = struct type rat = int * int exception Undefined (* val norm : int * int -> int * int *) (* Assumes: p >= 0, q > 0 *) fun norm (p,q) = let val d = gcd(p,q) in (p div d, q div d) end fun quotient (p,q) = if p < 0 orelse q <= 0 then raise Undefined else norm (p,q) fun fraction r = r fun plus ((p,q),(p',q')) = norm (p * q' + q * p', q * q') fun equal (r1,r2) = (r1 = r2) end; (* R.fraction(R.quotient(15,6)); R.fraction(R.quotient(0,5)) handle R.Undefined => 0; R.equal(R.quotient(2,3),R.quotient(~2,~3)); let open R in quotient(1,0) handle undefined => (0,1) end; let open R in quotient((1,0) handle undefined => (0,1)) end; *) (* Question 3: Higher-Order Functions *) type seq = int -> real val h : seq = (fn i => 1.0/real(i+1)); (* val add : (int -> real) * (int -> real) -> (int -> real) *) fun add (x:seq) (y:seq) = (fn i => x(i) + y(i)); (* val diff : (int -> real) -> (int -> real) *) fun diff (x:seq) = (fn i => x(i+1) - x(i)); (* val sum : (int -> real) -> (int -> real) *) fun sum (x:seq) = (fn 0 => x(0) | i => (sum x) (i-1) + x(i)); (* val seqToList : (int -> real) -> int -> real list *) (* n >= 0 *) fun seqToList (x:seq) (n:int) = let fun stl (0,l) = l | stl (i,l) = stl (i-1, x(i)::l) in stl (n,nil) end;